Изменение размера только изображений с определенным рисунком - PullRequest
0 голосов
/ 02 октября 2018

У меня есть каталог с некоторыми изображениями блога.Сейчас я ищу способ сделать массовое изменение размера только для изображений с сгенерированным uuid.Они имеют фиксированную структуру, поэтому это выглядит как хороший шаблон.

Как изменить размер только этих файлов, исключая все остальные?

mogrify -resize 600 *.png


eeafc286-ac2c-4bed-9e9b-d7d3c55e5965.png
ef0318d2-d3e2-42c2-a45e-8ededbb947ed.png
efcd681e-2c12-4a5a-ac77-5d6bf0a76810.png
error.png
f35a14cf-4b3d-4fc3-a8d3-6ea59a059a36.png
f4b60929-47c3-4b56-9486-e5efd62dc2e8.png
f6b3c4bd-f5ba-4d1d-96dd-6c61d5444a03.png
f76e04a3-75f4-4139-b1c9-080fe1e9fea4.png
fc141aa9-1d49-401f-a38a-734f7b0c142f.png
fdfff9df-2dab-4110-bd2f-b65635a5cb21.png
john.jpg
site_1.png
site_2.png
tech.jpg

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Есть миллион способов сделать это.Самое безопасное - просто ls |grep "yourpattern" > toprocess проверить правильность файлов, а затем cat toprocess| while read line; do mogrify -resize 600 $line"; done

0 голосов
/ 02 октября 2018

Я бы попробовал использовать этот подход:

  • вычислить наилучшее регулярное выражение, которое точно соответствует файлам, которые вы хотите
  • используйте его в качестве аргумента find, чтобы сначала найти файлычтобы изменить
  • , затем выполнить итерацию по списку файлов и вызвать mogrify

Пример скелета будет выглядеть так:

files=$( find -regexp "$pattern" )
for file in "$files"; do
  mogrify "$file" ;
done

Или даже короче с find -exec:

# Note: not tested, valid mogrify arguments must be added/handled
# call mogrify for each 'find' results
find -regexp "$pattern" -exec mogrify {} +;
# call mogrify in a subshell for each 'find' results, for finest argument handling
find -regexp "$pattern" -exec sh -c 'mogrify "$@"' {} +;

Где вам нужно будет «поиграть с передачей аргументов и порядком», чтобы заставить команду работать.

Примечание1: этот ответ не о том, «какой лучший шаблон соответствует»Ваш вопрос "вопрос, но о более общем подходе" поиска пользовательских файлов и выполнения команды для них "
Примечание 2: мой ответ не содержит проверенных и проверенных команд, но вместо этого используется подход, использующий find и find -exec.

(конструктивные) отзывы приветствуются.

0 голосов
/ 02 октября 2018

Я бы, наверное, пошел с *-*-*-*-*png, но если вы хотите быть конкретным, вы можете сделать грубое совпадение с помощью glob и более точное совпадение с регулярным выражением:

for file in *.png
do
    [[ $file =~ ^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}\.png$ ]] || continue
    mogrify -resize 600 "$file"
done
0 голосов
/ 02 октября 2018

Если вы хотите использовать подстановку файлов для соответствия точному шаблону, вы можете сделать:

mogrify -resize 600 [0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f]-[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f].png

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