使用shell脚本查找特定文件类型的文件

时间:2017-07-21 23:04:59

标签: bash shell file find

我需要以递归方式遍历目录中某些文件类型的所有文件。文件类型是一个数组变量,包含我们需要处理的文件类型列表。实际上,数组值是动态填充的。为了简单起见,我声明了一个静态数组。

 declare -a arr=("pdf" "doc" "txt")

我有以下代码以递归方式列出目录中的所有文件,但我无法弄清楚如何包含数组“arr”以仅返回数组中包含的那些文件类型。

find $i -type f -print0 | while read -d $'\0' file; do
    echo $file;
    #Process file
done

请帮我修改代码,以便我只检索指定的文件类型而不是所有文件。

2 个答案:

答案 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 \)
相关问题