Как я удаляю файлы определенного расширения, которые не имеют данной строки в их имени файла?

У меня есть каталог с файлами многих расширений в нем. Я хотел бы рекурсивно удалить *.srt файлы (и *.srt только файлы), которые не заканчиваются -en.srt (где srt расширение). Я предложил следующее решение, и это, кажется, хорошо работает, однако, я хотел бы знать, на ли это 100% корректно.

find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;
6
задан 13 August 2018 в 11:30

2 ответа

! - Сначала читает, ответ полностью затем используют его, если Вам нравится он-!

Ваша команда корректна, однако нет никакой потребности использовать -rf как rm параметры. потому что Вы удаляете файлы и не каталоги.

Другой ясный способ записать это (это - почти то же как Ваша команда):

find -name '*.srt' -and -not -name '*-en.srt' -type f -exec rm '{}' \;

или поскольку @steeldriver предположил, что можно использовать:

find -name '*.srt' -and -not -name '*-en.srt' -type f -ok rm '{}' \;

Это попросит Ваше разрешение удалить каждый основанный файл.

Можно также использовать -delete вместо rm {} \; однако знайте о его опасностях:

Не забывайте, что командная строка находки оценена, поскольку экспресс ‐ Сьон, таким образом помещая - удаляет, сначала сделает, находят попытку удалить все ниже начальных точек, которые Вы указали. Когда тестирование командной строки находки, которую Вы позже намереваетесь использовать с - удаляет, необходимо явно указать - глубина для предотвращения более поздних неожиданностей. Поскольку - удаляют, подразумевает - глубина, Вы не можете полезно использовать - чернослив и - удаляет вместе.


Это всегда - хорошая идея протестировать то, что собирается произойти прежде, чем сделать фактическое задание, таким образом, я предлагаю работать:

find -name '*.srt' -and -not -name '*-en.srt' -type f | grep -i en.srt

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

find -name '*.srt' -and -not -name '*-en.srt' -type f | less

проверять, что будет удаленным.

И не забывайте заключать в кавычки '{}':

(когда находка вызывается от оболочки), она должна быть заключена в кавычки (например, '{}') для защиты его от интерпретации оболочками.

8
ответ дан 23 November 2019 в 07:25

Давайте сделаем это только с bash globbing: С extglob и globstar опции включили,

rm **/!(*-en).srt

удаляет каждый файл, заканчивающийся в .srt исключая что-либо заканчивающееся в -en.srt от тока, а также любого подкаталога.
Если Вы не уверены в расширении как это, тестируете путем предварительного ожидания echo (см. пример ниже).

Пример

$ tree
.
├── 01.srt
├── 02.srt
├── no-en.srt
├── not-en.srt
├── subdir
│  ├── 01.srt
│  ├── 02.srt
│  ├── no-en.srt
│  └── not-en.srt
└── unrelated.png
$ shopt -s extglob globstar
$ echo rm **/!(*-en).srt
rm 01.srt 02.srt subdir/01.srt subdir/02.srt
$ rm **/!(*-en).srt
$ tree
.
├── no-en.srt
├── not-en.srt
├── subdir
│  ├── no-en.srt
│  └── not-en.srt
└── unrelated.png

Объяснения

  • **/ – с globstar опция включила, это соответствует любому количеству каталогов и подкаталогов
  • !(*-en) – с extglob опция включила, это соответствует чему-либо кроме данного шаблона, таким образом, что-либо не заканчивающееся в -en
4
ответ дан 23 November 2019 в 07:25

Другие вопросы по тегам:

Похожие вопросы: