迭代包含空格的文件列表
- 2024-09-30 14:00:00
- admin 原创
- 88
问题描述:
我想迭代文件列表。此列表是find
命令的结果,因此我想出了:
getlist() {
for f in $(find . -iname "foo*")
do
echo "File found: $f"
# do something useful
done
}
除文件名称中包含空格外,其他都正常:
$ ls
foo_bar_baz.txt
foo bar baz.txt
$ getlist
File found: foo_bar_baz.txt
File found: foo
File found: bar
File found: baz.txt
我该怎么做才能避免空间分裂?
解决方案 1:
您可以用基于行的迭代替换基于单词的迭代:
find . -iname "foo*" | while read f
do
# ... loop body
done
解决方案 2:
有几种可行的方法可以实现这一点。
如果您想要严格遵循原始版本,可以这样做:
getlist() {
IFS=$'
'
for file in $(find . -iname 'foo*') ; do
printf 'File found: %s
' "$file"
done
}
如果文件名中包含文字换行符,此操作仍会失败,但空格不会破坏它。
但是,没有必要与 IFS 打交道。以下是我首选的方法:
getlist() {
while IFS= read -d $' ' -r file ; do
printf 'File found: %s
' "$file"
done < <(find . -iname 'foo*' -print0)
}
如果您发现< <(command)
语法不熟悉,则应阅读有关进程替换的内容。与此相比,此方法的优点for file in $(find ...)
是可以正确处理带有空格、换行符和其他字符的文件。这是因为find
with-print0
将使用null
(aka