Как удалить определенный файл из набора результатов с помощью команды find в Linux?

Как удалить определенный файл из набора результатов с помощью команды find в Linux?

У меня есть следующая команда, которая выводит список всех файлов с расширением doc, docxи т.д.

find . -maxdepth 1 -iname \*.doc\*

Команда возвращает множество файлов, некоторые из которых я хотел бы удалить. Например, возвращаемые результаты:

  1. Пример.docx
  2. Dummydata.doc
  3. Образец.doc

Я хотел бы удалить Sample.doc и Dummydata.docx. Как удалить файлы с помощью опции -exec. Могу ли я передать имена файлов, например, rm Dummydata.docx Sample.docпоэтому команда будет выглядеть следующим образом

find . -maxdepth 1 -iname \*.doc\* -exec rm Dummydata.docx Sample.doc

Могу ли я передать имена файлов в {} afterrm`? Например

find . -maxdepth 1 -iname \*.doc\* -exec rm {Dummydata.docx} Sample.doc

Есть ли лучший способ сделать это?

решение1

Если вы заранее знаете имена файлов, будет проще просто удалить их сразу:

find . -iname "Dummydata.doc" -delete

Или, при наличии нескольких условий:

find . \( -iname "Dummydata.doc" -o -iname "Sample.doc" \)

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


В противном случае, если вы хотите сначала просмотреть список результатов, вы можете передать путь к найденным файлам – здесь, вставить в {}– в sh. Для shкоманды путь станет $0, и вы можете сравнить его с именем файла, который вы хотите удалить:

find . -maxdepth 1 -iname "*.doc" \
-exec sh -c 'if [ "$0" == "Dummydata.doc" ] || [ "$0" == "Sample.doc" ]; then echo rm "$0"; fi' {} \;

Здесь удалите, echoкак только вы будете уверены, что будет удален нужный файл. Но я боюсь, что будет проще просто вручную удалить файлы.

Связанный контент