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
?
在 中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
像使用bash
globstar一样遵循符号链接)
请注意,如果任何文件名包含换行符,您将在此处遇到问题。
标准、规范和可靠的语法是:
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 f
,D
包含隐藏文件,oN
不打扰对列表N
进行排序,如果没有匹配的文件则不抱怨),除了您不会收到您无权访问的目录的错误消息。