
Мне нужно преобразовать несколько .rgb
файлов в .png
s (каждый файл должен сохранить свое первоначальное имя).
Я хочу узнать, как преобразовать первый файл, а затем заключить команду в цикл «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