要删除所有最近修改时间超过2周的非隐藏文件和目录,我正在使用:
find ~ -mindepth 1 -mtime +14 -name "[!.]*" -delete
有时会打印错误消息“目录不为空”。
我想使这些错误保持沉默(当我作为cronjob运行时会收到有关它们的通知),但是find
当它们为空且超过2周时,我仍然想删除目录。
如果您find
支持-maxdepth
和-delete
非标准扩展名,则它可能也支持-empty
,因此您可以执行以下操作:
find ~ -mindepth 1 -mtime +14 ! -name '.*' \( ! -type d -o -empty \) -delete
(即,仅尝试删除空目录)
请注意,这-delete
暗示了-depth
(您希望删除包含文件的目录之前的文件)。
但是,从目录中删除文件会更新该目录的修改时间。这意味着即使目录包含已成功删除的旧文件(即使它们最初是旧文件)也不会被删除。
在这里,您可能根本不想删除任何目录:
find ~ -mtime +14 ! -name '.*' ! -type d -delete
或在删除任何文件之前记录旧目录的列表,删除非目录文件,然后在记录的列表中删除目录:
tmp=$(mktemp) &&
{
rm -f -- "$tmp"
find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 >&3
find ~ -mtime +14 ! -name '.*' ! -type d -delete
xargs -r0 rmdir <&4 2> /dev/null
} 3> "$tmp" 4< "$tmp"
或使用moreutils
sponge
(尽管这意味着将整个文件列表存储在内存中):
find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0 |
sponge sh -c '
find ~ -mtime +14 ! -name ".*" ! -type d -delete
xargs -r0 rmdir'
或zsh
的=(...)
进程替换的形式:
{
find ~ -mtime +14 ! -name ".*" ! -type d -delete
xargs -r0 rmdir
} < =(find ~ -depth -mindepth 1 ! -name '.*' -mtime +14 -type d -print0)
或者,您可以删除所有空目录,而不管它们是否旧:
find ~ -mindepth 1 ! -name '.*' \( -mtime +14 ! -type d -o -type d -empty \) -delete
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句