Сценарий оболочки для перемещения всех изображений, кроме изображений с размером в имени, с помощью команды find?

У меня есть резервная копия сервера на сайте WordPress, в каталоге загрузок которого содержится около 1000 изображений. Когда изображение загружалось через WordPress, оно создавало несколько размеров изображения, таких как:

foobar.jpg
foobar-170x170.jpg
foobar-250x250.jpg

Я знаком с использованием find переместить все файлы из каталога и его подпапок с чем-то вроде find . -mindepth 3 -type f -print -exec mv {jpe?g|png|gif} . \; но мне было любопытно узнать, можно ли добавить исключение по принципу "не двигай это". Я хотел бы дать шаблон, а затем исключить имена файлов, содержащих этот шаблон. Что-то вроде !(\d{2,5}x\d{2,5}\.(jpe?g|png|gif)),

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

1 ответ

Решение

Вы можете использовать найти -not или же ! выражения:

   -not expr
          Same as ! expr, but not POSIX compliant.

   ! expr True  if  expr  is false.  This character will also usually need
          protection from interpretation by the shell.

Итак, чтобы двигаться foobar.jpg но не два других, вы можете использовать:

find . -mindepth 3 -type f -regex '.*.jpg\|.*.jpeg\|.*png\|.*gif' \
       -not -regex '.*[0-9]+x[0-9]+.*' -exec mv {} . \;

Вы также можете сделать так, чтобы оно совпадало только с 2-5 цифрами по обе стороны от

find . -mindepth 3  -type f -regextype posix-egrep \
       -regex '.*.jpg|.*.jpeg|.*png|.*gif' -not -regex '.*[^0-9][0-9]{2,5}x[0-9]{2,5}.*' 
Другие вопросы по тегам