Как использовать «convert» и «xargs» вместе?

Как использовать «convert» и «xargs» вместе?

Мне нужно преобразовать несколько .rgbфайлов в .pngs (каждый файл должен сохранить свое первоначальное имя).

Я хочу узнать, как преобразовать первый файл, а затем заключить команду в цикл «for».

Вот что у меня есть на данный момент:

find . -name "*.rgb" | sort | sed -n \1\p | xargs convert zzzzz.png

Но это не работает.

Как мне заставить convertкоманду распознавать второй аргумент zzzzz.png?

решение1

Если вы хотите преобразовать все файлы в дереве каталогов, я бы выполнил:

find . -name '*.rgb' | parallel convert {} {.}.png

Параллельно будут выполняться:

convert ./foo.rgb ./foo.png
convert ./bar/quux.rgb ./bar/quux.png

Здесь я использую GNU Parallel, чтобы использовать все ваши процессоры. В зависимости от вашей системы вы можете установить его как пакет, в противном случае он здесьgnu.org/software/параллельный. В Debian это:

apt-get install parallel

Редактировать:
Вот решение без GNU Parallel:

find . -name '*.rgb' -exec sh -c 'convert "$0" "${0%.*}.png"' {} \;

и не очень хорошее решение с использованием while..read:

find . -name '*.rgb' | while read FILE; do convert "${FILE}" "${FILE%rgb}png" ; done

решение2

Для конвертации (в моем случае изменения размера) всех изображений в одном каталоге я использую

ls *.jpg | xargs -I {} convert {} -resize 1024x768 resized/{}

Обратите внимание, что фигурные скобки-заполнители для имени файла могут использоваться дважды. Вы также можете использовать их для добавления префикса к имени целевого файла.

Для рекурсивного поиска:

find -name '*.jpg' | xargs -I {} convert {} -resize 1024x768 resized/{}

решение3

Я нашел ответ:

for i in 'seq 1 $numOfRGBfiles'; do
#Insert code here that finds the file
#name of each rgb file and stores it 
#in $filename.

'find . -name "*.rgb" | sort | sed -n 
\$i\p |  xargs -I {} convert {} 
\$filename.png'
done

Связанный контент