要删除上次修改时间超过 2 周前的所有非隐藏文件和目录,我使用:
find ~ -mindepth 1 -mtime +14 -name "[!.]*" -delete
这有时会打印错误消息“目录不为空”。
我想消除这些错误(因为我在作为 cronjob 运行时收到有关它们的通知),但我仍然想在find
目录为空且超过 2 周时删除它们。
答案1
如果您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'
Orzsh
的=(...)
过程替换形式:
{
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