Пока у вас НЕ есть имена файлов со встроенным символом '\n'
, тогда подойдут следующие find
и grep
:
find . -type f | grep '^.*/[[:digit:]]\{1,5\}-image-[[:digit:]]\{1,5\}'
Он найдет все файлы ниже текущего каталога и совпадение (от 1 до 5 цифр), за которым следует "-image-"
, за которым следует еще один (от 1 до 5 цифр). В вашем случае со следующими файлами:
$ ls -1
123-image-99999-small.jpg
12345-image-1-medium.jpg
12345-image-2-medium.png
12345-image-3-large.jpg
12345-image-profile-large.png
12345-image-profile-medium.jpg
12345-image-profile-small.jpg
Запрошенные вами файлы сопоставляются в дополнение к 123-image-99999-small.jpg
, например,
$ find . -type f | grep '^.*/[[:digit:]]\{1,5\}-image-[[:digit:]]\{1,5\}'
./123-image-99999-small.jpg
./12345-image-3-large.jpg
./12345-image-2-medium.png
./12345-image-1-medium.jpg
Вы можете использовать указанное выше в подстановке команд, чтобы удалите файлы, например
$ rm $(find . -type f | grep '^.*/[[:digit:]]\{1,5\}-image-[[:digit:]]\{1,5\}')
Остальные файлы:
$ l1
12345-image-profile-large.png
12345-image-profile-medium.jpg
12345-image-profile-small.jpg
Если ваш find
поддерживает -regextype
Если ваш find
поддерживает regextype
, позволяющий указать, какой набор синтаксиса регулярных выражений использовать, вы можете использовать -regextype grep
для grep
синтаксиса и использовать что-то похожее на приведенное выше, чтобы удалить файлы с -execdir
, например,
$ find . -type f -regextype grep -regex '^.*/[[:digit:]]\+-image-[[:digit:]]\+.*$' -execdir rm '{}' +
Я не знаю, поддерживается ли это BSD или Solaris, и т. Д. c .., поэтому проверьте, прежде чем отключать его в сценарии. Также обратите внимание, что [[:digit:]]\+
проверяет (1 или более) цифр и не ограничивается 5-значными цифрами, как показано в вашем вопросе.