当我执行命令
时 find /local/DW/nan-campaign-reports -name "*.txt"
我得到了
/local/DW/nan-campaign-reports/Dec 2014/monthlyDump1.txt
/local/DW/nan-campaign-reports/Dec 2014/monthlyDump2.txt
但是当我做的时候
for i in `find /local/DW/nan-campaign-reports -name "*.txt"`
do
echo $i
done
我得到了
/local/DW/nan-campaign-reports/Dec
2014/monthlyDump1.txt
/local/DW/nan-campaign-reports/Dec
2014/monthlyDump2.txt
我如何获得它们是单行,
让echo "$(i)" or echo "$i"
没有帮助
答案 0 :(得分:1)
仅将输入字段分隔符设置为换行符,可以将每行视为新结果,而不是每个单词。
IFS=$'\n'
for i in `find /local/DW/nan-campaign-reports -name "*.txt"`
do
echo $i
done
IFS=
答案 1 :(得分:1)
我会通过一个问题回答你的问题:
你想对每个文件做什么?
如果您只想打印文件名,则无需解析find
的输出。如果您需要对文件执行相对简单的操作,则应使用-exec
开关。现在,如果你真的认为你需要解析find
的输出,并且你的find
支持-print0
标志(GNU查找,但它不是POSIX),那么:
while IFS= read -r -d '' i; do
echo "$i"
done < <(find /local/DW/nan-campaign-reports -name "*.txt" -print0)
这是唯一有效的方法。如果文件名包含换行符,则建议设置IFS=$'\n'
的答案将会中断,或者更糟糕的是,将受到路径名扩展的影响。这是一个演示:
$ touch ab.txt 'a[b].txt'
$ ls
ab.txt a[b].txt
$ # Surprising output:
$ IFS=$'\n'
$ for i in $(find -name '*.txt'); do echo "$i"; done
./ab.txt
./ab.txt
$ # Good output:
$ while IFS= read -r -d '' i; do echo "$i"; done < <(find -name "*.txt" -print0)
./ab.txt
./a[b].txt
通配符也会发生同样的事情(亲自尝试)。