Unix 中的 For 循环:包括来自子目录的文件

Vic*_*cky 6 for

Unix 中的一个简单 for 循环是:

for FILE in $BASE_WORK_DIR/*.pdf
   do
     echo $FILE
   done
Run Code Online (Sandbox Code Playgroud)

这将回.pdf显 BASE_WORK_DIR 目录中的所有文件。

如果还BASE_WORK_DIR包含子目录,其中也包含 pdf 文件怎么办。

在这种情况下,我如何设计我的 for 循环来获取所有 pdf 文件BASE_WORK_DIR以及子目录BASE_WORK_DIR

Gra*_*eme 6

在 中bash4,并且需要遵循目录的符号链接,您可以启用globstar和使用**

shopt -s globstar
for file in "$base_work_dir"/**/*.pdf
do
  echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

否则在sh脚本中,find可能是最好的方法:

IFS='
'
set -f
for file in $(find "$base_work_dir" -name *.pdf)
do
  echo "$file"
done
Run Code Online (Sandbox Code Playgroud)

(添加-L选项以find像使用bashglobstar一样遵循符号链接)

请注意,如果任何文件名包含换行符,您将在此处遇到问题。


Sté*_*las 6

标准、规范和可靠的语法是:

find . -type f -name '*.pdf' -exec sh -c '
  for f do
    something with "$f"
  done' sh {} +
Run Code Online (Sandbox Code Playgroud)

(请注意,sh如果文件列表很大,它可能会运行多次调用)。

随着zsh,相当于将

for f (./**/*(.NDoN)) {
  something with "$f"
}
Run Code Online (Sandbox Code Playgroud)

.for -type fD包含隐藏文件,oN不打扰对列表N进行排序,如果没有匹配的文件则不抱怨),除了您不会收到您无权访问的目录的错误消息。