我之前曾使用 find 来查找文件夹和子文件夹中的所有特定文件并对其进行处理
例如,我确实使用过
find /folder/ -name '*.txt' -exec chmod 666 {} \;
此代码可轻松更改文件夹中每个文本文件的写权限。
现在我打算尝试以相同的方式将每个 jpg(甚至 JPG)转换为 gif,但不确定这是否那么容易。当我尝试使用转换命令工具时,它希望有一个输入文件名和输出文件名,但我认为 find 不会提供这些,所以也许 find 不是合适的工具?
答案1
可以使用 Find 来实现这一点,但我发现使用 shell 更方便。如果您的文件都位于同一目录中(没有子目录),您可以这样做:
for f in /path/to/dir/*jpg /path/to/dir/*JPG; do
convert "$f" "${f%.*}.gif"
done
该语法将从变量的末尾${var%something}
删除 glob 的最短匹配。例如:something
$var
$ var="foo.bar.baz"
$ echo "$var : ${var%.*}"
foo.bar.baz : foo.bar
因此,这里是从文件名中删除最后一个扩展名。因此,"${f%.*}.gif"
是原始文件名,但使用.gif
而不是.jpg
或.JPG
。
如果确实需要递归到子目录,则可以使用 bash 的globstar
选项(来自man bash
):
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
您可以使用以下方式启用它shopt -s globstar
:
shopt -s globstar
for f in /path/to/dir/**/*jpg /path/to/dir/**/*JPG; do
convert "$f" "${f%.*}.gif"
done
答案2
您确实可以将find
- 与 shell 包装器一起使用,该包装器调用适当的convert
命令并使用参数替换生成输出文件。例如
find . -name '*.jpg' -execdir sh -c '
for f; do convert -verbose "$f" "${f%.*}.gif"; done
' find-sh {} +
更改-name
为-iname
以包含.JPG
扩展名(但请注意,无论如何替换.gif
扩展名都将是小写的)。
答案3
ImageMagick 中还有另一个工具mogrify
,旨在简化批处理。它可以满足您的要求:
shopt -s globstar
mogrify -format gif **/*.jpg