在终端中将每个文件从 JPEG 转换为 GIF

在终端中将每个文件从 JPEG 转换为 GIF

我之前曾使用 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

相关内容