Bash 读取路径中有空格的文件的脚本

Bash script to read files with path having spaces

当我执行命令时

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

将输入字段分隔符设置为仅换行符将使每一行都被视为一个新结果,而不是每个单词。

IFS=$'\n'
for i in `find /local/DW/nan-campaign-reports -name "*.txt"`
do
echo $i
done
IFS=

我会用一个问题来回答你的问题:

what do you want to do with each file?

如果只想打印文件名,则不需要解析find的输出。如果你需要对你的文件做一些相对简单的事情,你绝对应该使用 -exec 开关。现在,如果你真的相信你需要解析 find 的输出,并且如果你的 find 支持 -print0 标志(GNU find 支持,但不是 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

同样的事情也发生在通配符上(你自己试试)。