我希望清除 30 天以上的用户文件。下面的 bash 脚本工作得很好。但是,我希望删除输出中显示的“没有这样的文件或目录”错误,因为我有自己的回声。有人可以帮忙吗?
代码:
if [[ $(find /h/$USER/*.txt -mtime +30) ]]
then
find /h/$USER/*.txt -mtime +30 -print -exec rm -f {} \;
else
echo "No txt files to del"
fi
输出:
find: stat() error /h/username/*.txt: No such file or directory
No text files to del
答案1
这就是我的做法,在我们想要每晚清理的一堆目录上运行。
find /h/$USER -maxdepth 1 -name "*.txt" -type f -mtime +30 -delete
不能说这是最好还是最差的方法,但它已经运行了多年,没有任何问题,实际上是一个垃圾清理器的集合,所有语法都相同,没有问题,所以我想它对于生产来说已经足够好了。
答案2
这里的问题是,您使用的是 shell glob,而不是find
列出 txt 文件(它还会排除隐藏的 txt 文件,如果任何.txt
文件属于目录类型,它会下降到其中删除所有旧文件)。像这样的 shell bash
,当 glob 与任何文件都不匹配时,将 glob 按原样传递给find
并find
抱怨该不存在的*.txt
文件。
你可以这样做:
LC_ALL=C find "/h/$USER/." ! -name . -prune \
-name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + |
grep '^' > /dev/null || echo >&2 No text files to del
这grep
是为了检查是否find
产生任何输出(没有错误),因此我们输出没有要删除的文本文件如果没有,则显示消息(> /dev/null
如果您确实想查看我们尝试删除的文件,请删除 )。请注意,我们失去了find
进程中的退出状态。
您还可以使用zsh
其 glob 可以检查文件年龄(您已经zsh
通过不引用该语法来使用语法$USER
):
oldfiles=(/h/$USER/*.txt(NDm+30^/))
if (($#oldfile)); then
rm -f -- $oldfiles
else
echo >&2 No text files to del
fi
无论如何,对于-find -mtime +30
和zsh
的m+30
glob 限定符,请注意,它会选择 31 天或更早的文件,因为它以整数天数来比较年龄。不会选择 30 天零 23 小时的文件,因为其年龄四舍五入为 30 天,不大于 30。
答案3
使用以下命令将错误重定向到 /dev/null。所以不会显示错误
find path -type f -daystart -mtime +30 -exec rm -rvf {} \; 2>/dev/null
答案4
假设要删除 12 月的文件,首先列出文件 ls -l|grep "Dec" 第二个,如果您满意,请删除 rmls -l|grep "Dec"
让我知道您的反馈。 :)