У меня есть каталог с файлами многих расширений в нем. Я хотел бы рекурсивно удалить *.srt
файлы (и *.srt
только файлы), которые не заканчиваются -en.srt
(где srt
расширение). Я предложил следующее решение, и это, кажется, хорошо работает, однако, я хотел бы знать, на ли это 100% корректно.
find . -name "*.srt" ! -name "*-en.srt" -type f -exec rm -rf {} \;
! - Сначала читает, ответ полностью затем используют его, если Вам нравится он-!
Ваша команда корректна, однако нет никакой потребности использовать -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
проверять, что будет удаленным.
И не забывайте заключать в кавычки '{}'
:
(когда находка вызывается от оболочки), она должна быть заключена в кавычки (например, '{}') для защиты его от интерпретации оболочками.
Давайте сделаем это только с 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