Сценарий оболочки для перемещения всех изображений, кроме изображений с размером в имени, с помощью команды 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}.*'