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

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

возможно ли это сделать с помощью команды find в Linux?

решение1

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

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

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

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

решение2

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

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

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

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

решение3

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

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

решение4

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.

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