Bash脚本:查找所有文件类型和路径

时间:2009-07-15 14:58:25

标签: linux bash search directory

使用Bash,如何遍历指定文件夹中的文件夹,查找指定文件类型的所有文件,每次找到文件时,获取文件名和完整文件路径的完整文件路径,不带文件名作为变量并传递他们到另一个Bash脚本,执行它,并继续搜索下一个文件?

5 个答案:

答案 0 :(得分:15)

假设GNU find(这不是不合理的)你可以使用find来做到这一点:

find /path -type f -name '*.ext' -exec my_cool_script \{\} \;

答案 1 :(得分:4)

找到方法。使用xargs处理长文件/目录列表。此外,为了正确处理带空格的名称和类似的问题,我发现的最佳查找行命令是:

find ${directory} -name "${pattern}" -print0 | xargs -0 ${my_command}

技巧是与xargs -0兼容的find -print0:它用'\ 0'替换endlines以正确处理空格和转义字符。当文件列表太长时,使用xargs会让你有一些“行太长”的消息。

您可以使用带有--no-run-if-empty的xargs来处理空列表,并使用--replace来管理复杂命令。

答案 2 :(得分:2)

如果你安装了GNU Parallel http://www.gnu.org/software/parallel/,你可以这样做:

find . -name '*.ext' | parallel echo {} '`dirname {}`'

用您喜爱的bash命令替换echo,并使用您要查找的文件扩展名替换。

观看GNU Parallel的介绍视频了解更多信息: http://www.youtube.com/watch?v=OpaiGYxkSuQ

答案 3 :(得分:0)

看起来非常像家庭作业。

find /path -type f -name "*.ext" -printf "%p:%h\n" | while IFS=: read a b
do
   # execute your bash script here
done

阅读find的手册页以获取更多printf选项....

答案 4 :(得分:-1)

正如一些人已经提到的,Linux/UNIX 没有强制性的文件扩展名。但是,在基于 UNIX 的系统上,许多常见文件的类型可以由 file 命令确定。以下示例使用 file 命令将名称和类型或每个文件传递给 my_script:

    find /path -type f | xargs file | while read -r line ; do my_script $line; done

xargs 命令已被用于最小化文件命令的执行次数。

类型信息将非常广泛,从 xargs 文件步骤的以下示例输出中可以看出:

   /usr/bin/easy_install-3.8:                   Python script, ASCII text executable
   /usr/bin/splain:                             Perl script text executable
   /usr/bin/nvzoom:                             ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e2295b7d737246db5a2986c790452139793bdbfc, for GNU/Linux 3.2.0, stripped

从文件名中提取路径的其他要求可以在 my_script 中完成,或者如果它必须在 my_script 之前完成,通过使用 bash 字符串提取或 sed/awk/perl 重新格式化输出。

您是否希望任何文件名中包含空格或其他特殊字符,然后按照之前的答案中的建议,您可以使用 -print0:

    find /path -type f -print0 | xargs -0 file | while read -r line ; do my_script "$line"; done