删除7天前的文件

我写了以下命令来删除所有早于7天的文件,但它没有起作用:
find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;

如何删除这些文件?

11name'*.gz' 之间应该有一个空格。 - Jos
3个回答

正如@Jos指出的那样,你在name'*.gz'之间漏掉了一个空格;另外,为了加快命令的执行速度,可以使用-type f选项,只对文件运行该命令。
所以修正后的命令应该是:
find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' \;

解释:

  • find:用于查找文件目录链接等的Unix命令。
  • /path/to/:要开始搜索的目录。
  • -type f:只查找文件。
  • -name '*.gz':列出以.gz结尾的文件。
  • -mtime +7:只考虑修改时间早于7天的文件。
  • -execdir ... \;:对于每个找到的结果,在...中执行以下命令。
  • rm -- '{}':删除文件;{}部分是从前面的部分替换找到的结果的地方。--表示命令参数结束,避免提示错误对于那些以连字符开头的文件。

或者,使用:

find /path/to/ -type f -mtime +7 -name '*.gz' -print0 | xargs -r0 rm --

man find中:
-print0 
      True; print the full file name on the standard output, followed by a null character 
  (instead of the newline character that -print uses). This allows file names that contain
  newlines or other types of white space to be correctly interpreted by programs that process
  the find output. This option corresponds to the -0 option of xargs.

这样更高效一些,因为它相当于:
rm file1 file2 file3 ...

与之相反:
rm file1; rm file2; rm file3; ...

在`-exec`方法中。

另一种替代且更快的命令是使用 exec 的 + 终止符而不是 \;

find /path/to/ -type f -mtime +7 -name '*.gz' -execdir rm -- '{}' +

这个命令将在找到文件时只运行一次rm,而不是每次找到文件都运行一次。这个命令几乎和在现代的find中使用-delete选项一样快。
find /path/to/ -type f -mtime +7 -name '*.gz' -delete

13为什么我不能直接使用-delete来结束呢?为什么要搞这些+或者\;的东西呢? - rain01
6@rain01 请阅读 https://unix.stackexchange.com/q/167823/72456 - αғsнιη
我认为在使用find命令进行批量删除(例如所有*.gz文件)时,使用-maxdepth参数非常重要。Find命令似乎默认是递归的,它会在所有子目录中搜索匹配的模式。这可能是不希望的行为,因此最好使用-maxdepth 1来限制搜索深度。 - Joseph Kreifels II

为了完整性:您也可以使用-delete

find /some/where/ -name '*.log' -type f -mtime +7 -delete

这样你就不用针对每个文件运行一个命令。

1这是最好的答案。很好地将“-delete”部分放在行尾。我强烈建议任何考虑使用这种方法的人在实施之前阅读手册页面。 - MrPotatoHead

小心使用find命令删除文件。在运行命令时加上-ls选项,以检查要删除的内容。 find /media/bkfolder/ -mtime +7 -name '*.gz' -ls。然后从历史记录中找到该命令,并追加-exec rm {} \;
限制find命令的影响范围。如果你只想从一个目录中删除文件,可以使用-maxdepth 1来阻止find命令遍历子目录,或者在输入/media/bkfolder /时搜索整个系统。
我还添加了其他限制,比如更具体的名称参数-name 'wncw*.gz',添加了比某个时间新的文件-mtime -31,并对搜索的目录进行了引用。如果你正在自动化清理工作,这些限制尤为重要。 find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;

这个答案更安全。谢谢你。 - palerdot