我有以下printf代码,每次命中我的文件中的空格时都会添加换行符。如何阻止它添加此换行符。
文件列表:
<td><%= post.category.categoryname if post.category_id? %></td>
代码:
mytest
mytest stuff
new test things
输出:
for i in `find / -iname *test*`; do
printf $i'\n'; done
我试图去除空格,并在每个文件后面添加换行符:
/var/private/mytest
/var/private/mytest
stuff
/var/private/new
test
things
答案 0 :(得分:3)
find
此处仅用于实现您可以在纯bash
中执行的操作(假设版本4或更高版本):
shopt -s nocaseglob globstar nullglob
for i in /**/*test*; do
path=${i%/*}
base=${i#$path/}
printf '%s\n' "$path" "${base// /}"
done
答案 1 :(得分:1)
此处的问题与printf
没有任何关系,与for i in `find / -iname *test*`
无关。
使用不带引号的命令替换时,其输出将经历两个步骤:
IFS
中的字符将输出分为多个单词 - 默认情况下,空格,制表符和换行符)这意味着如果您使用命令touch 'my * test'
创建了文件,那么$i
将随后扩展为my
;然后将每个单独的文件称为*
,然后发送到test
。
如果你想在bash中安全地迭代find
的结果,并为每个名称生成一个无空格的版本,那么这样做如下所示:
while IFS= read -r -d '' i; do
printf '%s -> %s\n' "$i" "${i//[[:space:]]/}"
done < <(find / -iname '*test*' -print0)
将发出如下内容:
/var/private/mytest -> /var/private/mytest
/var/private/mytest stuff -> /var/private/myteststuff
/var/private/new test things -> /var/private/newtestthings
答案 2 :(得分:0)
ls=$(find . -iname '*test*' | sed 's/ //g')
for i in ${ls}
do
echo "$i"
done
测试
./mytest
./myteststuff
./newtestthings