这个经典的解决方案(当名称中只有空格时)不起作用
find . -name '*.html' -print0 | while IFS= read -r -d ''; do
因为 html 文件还包含垂直线 ( |
)。
答案1
find . -name '*.html' -print0 | while IFS= read -r -d ''; do
该行中没有任何内容会对名称中包含空格和/或管道组合的文件名产生任何问题:
bash-4.4$ touch 'A|B' '1|2' 'quux|foo bar'
bash-4.4$ ls
1|2 A|B quux|foo bar
bash-4.4$ find . -print0 | while IFS= read -r -d ''; do printf '"%s"\n' "$REPLY"; done
"."
"./A|B"
"./1|2"
"./quux|foo bar"
还要注意,根据您想要对找到的名称执行的操作,使用-exec
fromfind
本身几乎总是更好:
find . -type f -name "A*" -exec cat {} \;
另一个问题的相关回答:为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?(特别参见该答案中的“如何处理 find 找到的文件?”)。
答案2
find
对于非常旧的版本bash
(4.0 之前的版本),您只需要这样一个简单的调用。使用globstar
运算符要简单得多:
shopt -s globstar
for f in **/*.html; do
...
done