цель — найти каталоги с заданным именем и удалить все файлы внутри них, сохранив реальные каталоги
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.