Bash,在包含子目录的目录中的每个 .jpg 文件上运行脚本

2024-04-29

我有一些工作代码,它非常简单 - 它复制每个 *.jpg 文件,将其重命名为 *1.jpg,不用担心。

for i in *.jpg; do cp $i ${i%%.jpg}1.jpg;  done

我如何运行它,以便它适用于目录中的每个文件,该目录的子目录中的每个文件

目录结构示例:

    test/test1/test2/somefile.jpg
    test/anotherfile.jpg
    test/test1/file.jpg
etc

对目录结构递归执行任何操作的命令是find:

find . -name "*.jpg" -exec bash -c 'file="{}"; cp "$file" "${file%%.jpg}1.jpg"' \;

Using -exec代替for i in $(find ...)将处理包含空格的文件名。当然,还有一个引用陷阱;如果文件名包含", the file="{}"将扩展到file="name containing "quote characters"",这显然已损坏(file会变成name containing quote它会尝试执行characters命令)。

如果您有这样的文件名,或者您可能有这样的文件名,请使用以下命令打印出用空字符分隔的每个文件名(文件名中不允许使用空字符)-print0,并使用while read -d $'\0' i循环遍历以 null 分隔的结果:

find . -name "*.jpg" -print0 | \
    (while read -d $'\0' i; do cp "$i" "${i%%.jpg}1.jpg";  done)

与任何像这样的复杂命令一样,最好在不执行任何操作的情况下对其进行测试,以确保它在运行之前扩展为合理的内容。最好的方法是在实际命令前面加上echo,因此您将看到它将运行的命令,而不是运行它:

find . -name "*.jpg" -print0 | \
    (while read -d $'\0' i; do echo cp "$i" "${i%%.jpg}1.jpg";  done)

一旦你目视它并且结果看起来不错,就删除它echo并再次运行它以真正运行它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Bash,在包含子目录的目录中的每个 .jpg 文件上运行脚本 的相关文章