我正在尝试编写一个命令来帮助清除旧的缓存资产文件。文件总是.css
、.javascript
或.css.gzip
,.javascript.gzip
我想删除所有超过 2 天的文件。
在传递给之前,我首先使用此命令进行测试exec rm
:
find /home/*/tmp/cache/* -mtime +2 -type f -name '*.css.gzip' -o -name '*.javascript.gzip' -o -name '*.javascript' -o -name '*.css'
这将返回我想要删除的所有文件,因此我添加了rm
以下命令:
find /home/*/tmp/cache/* -mtime +2 -type f -name '*.css.gzip' -o -name '*.javascript.gzip' -o -name '*.javascript' -o -name '*.css' -exec rm {} \;
但实际上并没有删除任何内容,我尝试发出命令rm
,rm -i
但没有任何提示,好像实际上没有任何东西被传递给 rm。
有任何想法吗?
FWIW 这是在 CentOS 5 盒子上
答案1
问题是,-exec ...
在所有这些标志的末尾添加-o
会破坏 AND 与 OR 的优先级,例如,它会查找所有 *.css.gzip OR *.javascript.gzip OR *.javascript OR (*.css AND 删除它),因此它只会删除 *.css,但会找到所有其他文件,但不会对它们执行任何操作。顺便说一句,这也意味着您的 type 和 mtime 标志仅适用于 *.javascript.gzip。
使用
find /home/*/tmp/cache/* -mtime +2 -type f \( -name '*.css.gzip' -o -name '*.javascript.gzip' -o -name '*.javascript' -o -name '*.css' \) -exec rm {} \;
为了强制它找到所有带有 mtime +2 的文件并输入 f 并(所有不同的文件名选项)并删除它们。
要查看其实际效果,请在您的版本和我的版本中将 -exec ... 替换为 -print ()。
答案2
尝试将 rm 改为 echo 并查看其作用。如果没有返回任何内容,请删除 echo,您可能会记得在添加 rm 之前稍微更改命令 :)。
答案3
执行第一个命令,管道到 xargs rm。我通常也喜欢考虑带空格的文件名,因此请尝试以下操作:
find /home/*/tmp/cache/* -mtime +2 -type f -name '*.css.gzip' -o -name '*.javascript.gzip' -o -name '*.javascript' -o -name '*.css' -print0 | xargs -0 rm
答案4
尝试使用 xargs:
find /home/*/tmp/cache/* -mtime +2 -type f -name '*.css.gzip' -o -name '*.javascript.gzip' -o -name '*.javascript' -o -name '*.css' -print0 | xargs -0p rm
xargs 的参数-p
会提示您每一批要删除的文件。如果一切正常,您可以删除,-p
以便一次性删除所有文件。
-print0
/组合-0
使用空值而不是空格作为分隔符,以确保正确处理奇数文件名(例如带有空格的文件名)。