запускать программу несколько раз с помощью одной командной строки - PullRequest
2 голосов
/ 02 мая 2010

В моей системе 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 inputfile -o outputfile

У меня вопрос: можно ли написать однострочную команду, используя xargs, awk, find и т. Д., Чтобы запустить мою программу один раз для каждого из этих файлов? Или я должен написать сценарий оболочки с циклом?

Ответы [ 2 ]

3 голосов
/ 02 мая 2010

Для такой работы, возможно, стоит посмотреть справочную страницу find, особенно параметр -exec.

Вы можете написать что-то вроде:

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

Вы можете поиграть с комбинациями dirname и basename, чтобы получить лучшее имя для выходного файла, хотя в этом случае я бы предпочел использовать цикл for, например:

for i in `find . -name "*.gif"`; do
  DIR=`dirname $i`
  NAME=`basename $i .gif`
  gif2bmp -i $i -o ${DIR}/${NAME}.bmp
done
1 голос
/ 18 января 2014

Используя GNU Parallel, вы можете сделать:

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

Дополнительным преимуществом является то, что он будет выполнять одно задание параллельно для каждого ядра процессора.

Посмотрите вступительное видео для быстрого ознакомления: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1

Пройдите по уроку (http://www.gnu.org/software/parallel/parallel_tutorial.html). В командной строке вы любите вас за это.

...