问题描述
我在下面写命令删除所有超过7天的文件,但它不起作用:
find /media/bkfolder/ -mtime +7 -name'*.gz' -exec rm {} \;
我该如何删除这些文件?
最佳解决思路
@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
次佳解决思路
小心删除带有find的文件。使用-ls运行命令以检查要删除的内容
find /media/bkfolder/ -mtime +7 -name '*.gz' -ls
。然后从历史记录中提取命令并附加-exec rm {} \;
限制find命令可以执行的操作。如果要从一个目录中删除文件,-maxdepth 1
会阻止查找遍历子目录,或者如果输入错误/media/bkfolder /
则搜索整个系统。
我添加的其他限制是更具体的名称参数,如-name 'wncw*.gz'
,添加newer-than时间-mtime -31
,并引用搜索的目录。如果要自动清理,这些特别重要。
find "/media/bkfolder/" -maxdepth 1 -type f -mtime +7 -mtime -31 -name 'wncw*.gz' -ls -exec rm {} \;