![如何在bash中循环遍历名称包含竖线和空格的文件](https://linux22.com/image/116871/%E5%A6%82%E4%BD%95%E5%9C%A8bash%E4%B8%AD%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E5%90%8D%E7%A7%B0%E5%8C%85%E5%90%AB%E7%AB%96%E7%BA%BF%E5%92%8C%E7%A9%BA%E6%A0%BC%E7%9A%84%E6%96%87%E4%BB%B6.png)
这个经典的解决方案(当名称中只有空格时)不起作用
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