【问题标题】:run program multiple times using one line shell command使用一行 shell 命令多次运行程序
【发布时间】:2011-02-14 19:28:00
【问题描述】:

我的 linux 系统上有以下 gif:

$ find . -name *.gif
./gifs/02.gif17.gif
./gifs/fit_logo_en.gif
./gifs/halloween_eyes_63.gif
./gifs/importing-pcs.gif
./gifs/portal.gif
./gifs/Sunflower_as_gif_small.gif
./gifs/weird.gif
./gifs2/00p5dr69.gif
./gifs2/iss013e48788.gif
...and so on

我写的是一个将GIF文件转换为BMP的程序,界面如下:

./gif2bmp -i 输入文件 -o 输出文件

我的问题是,是否可以使用 xargs、awk、find 等编写一行命令来为这些文件中的每一个运行一次我的程序?还是我必须写一个带循环的shell脚本?

【问题讨论】:

    标签: command-line shell


    【解决方案1】:

    对于这类工作,可能值得查看 find 手册页,尤其是 -exec 选项。

    你可以这样写:

    find . -name *.gif -exec gif2bmp -i {} -o {}.bmp \;
    

    您可以使用dirnamebasename 的组合来获得更好的输出文件命名,但在这种情况下,我更喜欢使用shell for 循环,例如:

    for i in `find . -name "*.gif"`; do
      DIR=`dirname $i`
      NAME=`basename $i .gif`
      gif2bmp -i $i -o ${DIR}/${NAME}.bmp
    done
    

    【讨论】:

    • 谢谢,这正是我想要的。我最终使用了以下命令: find 。 -name *.gif -exec ./convert -i {} -o {}.bmp \;唯一的问题是我的输出文件扩展名为 .bmp.gif,但至少它可以工作:)
    • 好的单线tonio。 .gif.bmp 问题是为什么我通常会使用额外的行来提取基本文件名并更改扩展名。
    • @teehoo:后缀问题的答案是写一个shell脚本来覆盖转换器:exec ./gif2bmp -i "$1" -o "${1%.gif}.bmp"。然后从find 运行它:find . -name '*.gif' -exec ./wrapper {} \;
    【解决方案2】:

    使用 GNU Parallel 你可以做到:

    parallel ./gif2bmp -i {} -o {.}.bmp ::: *.gif
    

    额外的好处是它将为每个 cpu 内核并行运行一个作业。

    观看介绍视频以快速了解:https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

    浏览教程 (http://www.gnu.org/software/parallel/parallel_tutorial.html)。你爱你的命令行。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 2011-08-02
    • 2013-05-27
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多