目标是找到具有给定名称的目录并删除其中的所有文件,保留实际目录
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 命令可以实现吗?
答案1
我尝试了一些方法,似乎有效,这是 Alex 在此处发布的类似解决方案。
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 附加到 for 循环中的 find 中。我当然建议先按编写的方式运行,以测试逻辑并确保匹配看起来不错。
答案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.