【问题标题】:How to use a linux command for set of files如何对一组文件使用 linux 命令
【发布时间】:2009-06-30 17:58:24
【问题描述】:

我正在寻找一种解决方案来使用终端和 linux 下的“convert”命令转换一组文件。我可以对每个文件使用“转换”:

convert -quality 85 file.jpg file.jpg

但我正在寻找类似的东西:

for each jpg do
  convert -quality 85 $file $file
end

谁能告诉我,我可以使用哪个命令?

【问题讨论】:

    标签: linux command-line terminal


    【解决方案1】:
    for i in *.jpg; do
       convert ... $i $i
    done
    

    应该这样做。这将适用于 sh/bash/zsh 等。它假定您所有的 *.jpg 文件都在当前目录中。否则,将 *.jpg 替换为适当的查找调用,例如

    for i in `find . -name "*.jpg" -print`; do
    

    注意反引号。这些表示应该执行包含的命令,并将结果返回到调用结构(在本例中为 for 循环)

    如果你使用zsh,那么你可以这样做

    for i in **/*.jpg; do
    

    在通配符中搜索子目录,并使用advanced zsh wildcard syntax 进一步限定这些子目录。不过,我不确定 bash 在这方面提供了哪些设施。

    【讨论】:

    • 别忘了 xargs。不一定像 for 循环那样强大,但通常很容易知道它是可用的:find -name '*.jpg' | xargs -l -i 转换 -quality 85 {} {}
    • 哦!我不知道你可以用 xargs 做到这一点!我觉得自己更聪明了。
    • 或者即使没有 xargs 也可以通过: find 。 -name "*.jpg" -exec 转换 -quality 85 {} \:
    • Bash 4.0,一旦您使用shopt -s globstar 启用 globstar shell 选项,就会像 Zsh 一样处理 */.jpg。
    • 你可以使用 $(...) 代替反引号,这在恕我直言更清楚一点。
    【解决方案2】:

    您可以使用其姊妹命令mogrify 来编辑文件,而不是convert通过覆盖自身来编辑每个文件。此外,这两个命令都具有内置的 globbing,因此它们可以在一次调用中修改所有图像,这比每个图像运行一次程序要快。请参阅ImageMagick Command Line Processing 了解更多信息。

    这样就可以了:

    mogrify '*.jpg' -quality 85
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Bash,则可以执行以下操作:

      $ for f in `ls path/to/jpegs/*.jpg`; do convert -quality 85 $f $f; done
      

      这将遍历给定目录中的所有 JPEG 文件并进行转换。

      如果你没有使用 Bash,你的 shell 可能有类似的 for-loop 语法;检查手册页。

      【讨论】:

        【解决方案4】:

        如果你有一台多核机器,你可以通过并行来获得一些真正的速度:

        mkdir -p converted
        find -iname '*.jpg' -print0 | xargs -0 -P<number of cores> -n1 -Ifoo convert -quality 85 foo converted/foo
        

        【讨论】:

          【解决方案5】:

          我会写一个 shell 脚本。如果您不熟悉 shell 编程,请参阅this page

          #!/bin/sh
          
          for arg in `ls *.jpg`
          do
              convert -quality 85 $arg $arg
          done
          

          【讨论】:

          • '$files $files',而不是 '$arg $arg' 或者相反?
          【解决方案6】:

          怎么样? :

          find [-maxdepth 1] -iname "*.jpg" -exec mogrify -quality 85 {} \;
          
          • 可选-maxdepth 1 仅对当前目录进行操作(无子目录。)
          • ImageMagick 附带mogrify,它可以就地修改文件。

          【讨论】:

            【解决方案7】:
            find . -name '*.jpg' -exec convert -quality 85 {} {} \;
            

            【讨论】:

              猜你喜欢
              • 2012-08-31
              • 2015-05-25
              • 1970-01-01
              • 1970-01-01
              • 2016-11-30
              • 2011-06-14
              • 2014-02-12
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多