запуск программы несколько раз с помощью одной строчной команды оболочки

#command-line #shell

#командная строка #оболочка

Вопрос:

В моей системе 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 и т.д. запустить мою программу один раз для каждого из этих файлов? Или я должен написать сценарий оболочки с циклом?

Ответ №1:

Для такого рода работы, возможно, стоит взглянуть на 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. Спасибо, это именно то, что я искал. В итоге я использовал следующую команду: find . -name *.gif -exec ./convert -i {} -o {}.bmp ; Единственная проблема с этим заключается в том, что мой выходной файл имеет расширение.bmp.gif , но, по крайней мере, это работает 🙂

2. Хороший однострочный tonio. Проблема .gif.bmp заключается в том, что я обычно использую дополнительные строки, чтобы извлечь базовое имя файла и изменить расширение.

3. @teehoo: решение проблемы с суффиксом заключается в написании сценария командной оболочки для работы с конвертером: exec ./gif2bmp -i "$1" -o "${1%.gif}.bmp" . Затем вы запускаете ее из find : find . -name '*.gif' -exec ./wrapper {} ; .

Ответ №2:

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

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

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

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

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

Комментарии:

1. Интересно, спасибо за информацию — хотя это не стандартная утилита для установки Debian Jessie по умолчанию: (

2. Посмотрите, учтено ли ваше оправдание на oletange.blogspot.dk/2013/04/why-not-install-gnu-parallel.html