我需要以递归方式遍历目录中某些文件类型的所有文件。文件类型是一个数组变量,包含我们需要处理的文件类型列表。实际上,数组值是动态填充的。为了简单起见,我声明了一个静态数组。
declare -a arr=("pdf" "doc" "txt")
我有以下代码以递归方式列出目录中的所有文件,但我无法弄清楚如何包含数组“arr”以仅返回数组中包含的那些文件类型。
find $i -type f -print0 | while read -d $'\0' file; do
echo $file;
#Process file
done
请帮我修改代码,以便我只检索指定的文件类型而不是所有文件。
答案 0 :(得分:3)
您需要做的是从您的类型数组(假设扩展名)动态构建 regex ,并使用{{1}传递给find
}} 选项。然后,-regex
可以使用find
查找匹配的文件名。根据您的示例,您希望构建类似于
regex
为了从数组内容动态构建该正则表达式,您可以执行类似于以下内容的操作
"^.*[.]\(pdf\|doc\|txt\)$"
(注意这对于循环和数组使用bash特定的C风格,因此它不是POSIX shell可移植的 - 因为你使用数组不应该是一个问题)< / p>
尝试一下,如果符合您的需求,请告诉我。
答案 1 :(得分:3)
我认为按文件类型“pdf”,“doc”,“txt”, 你的意思是带有这些扩展名的文件名。
如果文件类型的数量相当小(少于几打), 然后你可以构建一个参数数组,以格式:
传递给find
... -name '*.pdf' -o -name '*.doc' -o -name '*.txt' ...
假设文件类型数组不为空,这是一种方法(感谢@mike-holt):
arr=(pdf doc txt)
findargs=()
for t in "${arr[@]}"; do
findargs+=(-name "*.$t" -o)
done
find . -type f \( "${findargs[@]}" -false \)