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
同样的事情也发生在通配符上(你自己试试)。
当我执行命令时
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
同样的事情也发生在通配符上(你自己试试)。