#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