find: удалить папку и подпапки, но добавить исключение в два файла

Я пытаюсь использовать команду find для выполнения следующих действий:
Удалите всю папку с файлами, папками и подпапками, за исключением 2 файлов, вот пример того, что мне нужно:

  test/folder1/file1.txt test/folder1/file2.txt test/folder1/subfolder1/ test/folder1/subfolder1/file3.txt test/folder1/subfolder1/subfolder2/file4.txt test/folder2/file5.txt test/folder3/file6.txt 

Мне нужно удалить все, кроме file2.txt и file3.txt

Вот что я уже сделал

  find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' 

Это перечислит мне все файлы, кроме указанных мной. Однако, если я добавлю -exec rm -rf {} к концу команды, он удалит все.

Я также пробовал эту другую команду и не работал

 rm -r test/folder1/ !(file2.txt|file3.txt) 

Я не знаю много о регулярном выражении, поэтому я пытаюсь заставить его работать, тестируя команды, которые я нашел в Интернете, однако ни один из них, похоже, не работает.

2 Solutions collect form web for “find: удалить папку и подпапки, но добавить исключение в два файла”

Не называть rm -rf . Как только вы запустите его в каталоге, который удалит все файлы в каталоге и подкаталогах, даже те, которые вы хотите сохранить. В более общем плане, не вызывайте rm -rf если вы не знаете, почему простой rm не будет делать. Здесь rm -f гарантируется, если вы хотите убедиться, что ваш скрипт не попросит подтверждение удалить файл только для чтения, но -r явно не оправдан.

Чтобы просто удалить файлы:

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a -exec rm -f {} + 

Если вы также хотите удалить каталоги, которые становятся пустыми, вызовите rmdir на них. Используйте -depth чтобы содержимое каталога рассматривалось перед самим каталогом.

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a \( -type d rmdir {} \; -o -exec rm -f {} \; \) 

Вы получите ошибки из rmdir запущенные на непустых каталогах, они раздражают, но безвредны.

Если ваша находка имеет -delete и -empty (например, GNU find), вам не нужно вызывать rm и rmdir .

 find /test* ! -path '/test/folder1/file2.txt' -a ! -path 'test/folder1/subfolder1/file3.txt' -a ! -type d ! -empty -delete 

Послушайте, я также не знаю, как это сделать с помощью опций find , но вы также можете использовать shell-скрипты:

Сначала удалите файлы:

  find . -type f -exec bash -c \ ' [[ "{}" == "./test/folder1/file2.txt" || \ "{}" == "./test/folder1/subfolder1/file3.txt" ]] \ || rm "{}" ' \; 

И затем удалите все не пустые папки:

 find . -type d -exec rmdir {} \; 2>/dev/null 
  • Regex in find - OS X
  • Простой способ найти файлы, применить изменения и записать в другой каталог под разными именами?
  • копировать файлы, измененные после определенной даты с помощью cp-переключателей
  • Фильтровать файлы, сгенерированные `find`, с помощью обработанного вывода команды` file`
  • Как создать копию файла в нескольких каталогах?
  • Как я могу заменить эту команду оболочки?
  • найти командную помощь
  • Как выполнить команду find в сценарии оболочки без получения сообщения об ошибке «Отсутствующий аргумент для -execdir»?
  • Как найти текст в файле и найти его в нескольких подпапках?
  • как вывести вывод поиска в другой поиск
  • Как распечатать совпадение, а также запустить -exec
  • Linux и Unix - лучшая ОС в мире.