Назад | Перейти на главную страницу

Linux Find для удаления файлов в папках

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

find /home/www/sites/ -iname '_cache' -exec du -hs {} \;

это дает мне список файлов с их размером

204K    /home/www/sites/test.site.com/html/development/Temporary/_cache
904K    /home/www/sites/test.site2.com/html/development/Temporary/_cache

можно ли добиться с помощью команды поиска Linux?

Я что-то пробовал, и кажется, что это работает, это аналогичное решение, которое Алекс опубликовал здесь.

find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -exec rm {} \;

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

Конечно, попробуйте перед использованием и вместо rm поместите туда ls или что-нибудь безобидное.

Я не тестировал эту логику полностью ... но вы можете сделать что-нибудь внутри цикла, например:

for findname in $(find /path/to/search -name '_pattern')
do
  find $findname -type f
done

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

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

Правильная команда для его стирания

find . -iname '_cache' | xargs -I {} find {} -type f -maxdepth 1 -delete 

find имеет параметр -delete. Это удалит все совпадения.

Со страницы руководства

-Удалить

          Delete files; true if removal succeeded.  If the removal failed,
          an  error message is issued.  If -delete fails, find's exit stat-
          us will be nonzero (when it eventually exits).  Use of  -delete
          automatically turns on the -depth option.

          Warnings:  Don't  forget that the find command line is evaluated
          as an expression, so putting -delete first will make find try to
          delete everything below the starting points you specified.  When
          testing a find command line that you later intend  to  use  with
          -delete,  you should explicitly specify -depth in order to avoid
          later surprises.  Because -delete  implies  -depth,  you  cannot
          usefully use -prune and -delete together.