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