Вероятно, стандартная программа будет работать так: взять шаблон имени файла «in» и шаблон имени файла «out» и выполнить операцию с каждым файлом в текущем каталоге, который соответствует шаблону «in», заменив соответствующие части. в "Out" шаблон. Это довольно легко, если у вас есть жестко запрограммированный шаблон, когда вы можете написать одноразовые команды, такие как
for infile in *.jpg; do convert $infile -filter bessel -resize 30% ${infile//allfiles/newnames}; done
Однако, чтобы создать скрипт, который будет делать это с любым шаблоном, вам нужно что-то более сложное, потому что преобразование вашего имени файла может быть чем-то более сложным, чем просто замена одной части другой. К сожалению, Bash на самом деле не дает вам способа определить, какая часть имени файла соответствует определенной части шаблона, поэтому вам придется использовать более мощный механизм регулярных выражений, такой как sed
, например:
#!/bin/bash
inpattern=$1
factor=$2
outpattern=$3
for infile in *; do
outfile=$(echo $infile | sed -n "s/$inpattern/$outpattern/p")
test -z $outfile && continue
convert $infile -filter bessel -resize $factor% $outfile
done
Это может быть вызвано как
./resizemany.sh 'allfiles\(.*\).jpg' 30 'newnames\1.jpg'
. , (Это не так уж плохо, на самом деле)