如何在bash中循环遍历名称包含竖线和空格的文件

如何在bash中循环遍历名称包含竖线和空格的文件

这个经典的解决方案(当名称中只有空格时)不起作用

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"

还要注意,根据您想要对找到的名称执行的操作,使用-execfromfind本身几乎总是更好:

find . -type f -name "A*" -exec cat {} \;

另一个问题的相关回答:为什么我的 shell 脚本会因为空格或其他特殊字符而卡住?(特别参见该答案中的“如何处理 find 找到的文件?”)。

答案2

find对于非常旧的版本bash(4.0 之前的版本),您只需要这样一个简单的调用。使用globstar运算符要简单得多:

shopt -s globstar
for f in **/*.html; do
    ...
done

相关内容