как удалить файлы с указанным шаблоном c в linux? - PullRequest
1 голос
/ 26 мая 2020

У меня есть набор таких изображений

12345-image-1-medium.jpg 12345-image-2-medium.png 12345-image-3-large.jpg

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

У меня также есть эти изображения, которые не нужно выбирать

12345-image-profile-small.jpg 12345-image-profile-medium.jpg 12345-image-profile-large.png

Я пробовал это регулярное выражение, но не работал

1234-image-[0-9]+-small.*

Я думаю, что bash не поддерживает регулярное выражение, как в Javascript, Go, Python или Java

Ответы [ 3 ]

1 голос
/ 27 мая 2020

Пока у вас НЕ есть имена файлов со встроенным символом '\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-значными цифрами, как показано в вашем вопросе.

0 голосов
/ 26 мая 2020

Хорошо, я решаю это с помощью этого шаблона

12345-image-*[0-9]-*

например:

rm -rf 12345-image-*[0-9]-*

он соответствует всем именам файлов, начинающимся с 12345-image-, затем number, затем - символ и все, что после этого

, как я обнаружил, это globbing в bash не regex, и я обнаружил, что это приложение действительно использует полный

0 голосов
/ 26 мая 2020
for pic in 12345*.{jpg,png};do rm $pic;done

для получения дополнительной информации о подстановочных знаках посмотрите здесь

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