Bash脚本用于读取具有空格的路径的文件

时间:2015-01-11 08:05:31

标签: bash shell unix zsh

当我执行命令

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"没有帮助

2 个答案:

答案 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

通配符也会发生同样的事情(亲自尝试)。