查找并删除超过 30 天的文件

查找并删除超过 30 天的文件

我希望清除 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 按原样传递给findfind抱怨该不存在的*.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 +30zshm+30glob 限定符,请注意,它会选择 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" 让我知道您的反馈。 :)

相关内容