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