Bash脚本删除带有子目录的x天之前的文件


37

我正在尝试删除大量超过x天的文件。

现在我有一个脚本可以做到这一点

find /path/to/files* -mtime +10 -exec rm {} \; 

但这也会删除子目录。有很多文件夹,但我想保留它们,并删除所说文件夹中10天以上的文件。

有没有办法做到这一点?

Answers:


50

type 筛选结果的选项

find接受type仅用于选择文件的选项。

find /path/to/files -type f -mtime +10 -delete

留下-delete来显示它要删除的内容,一旦确认,就继续运行完整的命令。

那只会在文件上运行,而不会在目录上运行。使用-type d了逆,只列出符合您的论点,即目录。


附加选项

您可能想阅读man find,因为将来可能需要更多选择。例如,-maxdepth将允许您仅将找到的项目限制为特定深度,例如-maxdepth 0不会递归到子目录中。

一些评论

  • 我不知道该命令将如何删除文件夹,因为您不能rm仅删除一个文件夹。您需rm -r要这样做。

  • 另外,/path/to/files*令人困惑。您是说/path/to/files/还是希望通配符扩展为多个文件和文件夹名称?

  • {}在单引号,即'{}'避免由shell来解释取代的文件/目录名,就像我们保护用反斜杠分号。


好吧,/ path / to / files /中有很多文件夹,实际上我想对每个文件夹运行mtime +10 -exec rm,但要保留文件夹本身,基本上我想实现的是删除所有超过10天的文件,并保留所有文件夹。我是新手,抱歉,这是新手:)
JoyIan Yee-Hernandez 2012年

好了,你去了:)只需执行一个find /path/to/files* -type f -mtime +10,看看它会输出什么。
slhck 2012年

是的,如果有疑问,请不要执行-exec,请先查看它的发现。
罗布2012年

2
@ JoyIanYee-Hernandez您还可以使用的-delete参数find,以删除所有文件和文件夹,仅当空时才删除后者。这意味着-depth,即深度优先搜索。
丹尼尔·贝克

1
@Kreker然后,您需要添加-mindepth 1以排除父目录。
slhck

5

与先前的答案一样(两者均为+1),诀窍是使用-type f谓词。

注意,代替-exec rm '{}'您也可以使用-delete谓词。但是不要那样做。-exec rm '{}'您可以(并且应该)首先与您-exec echo rm '{}'核实这是否确实是您想要的。之后,重新运行不带的命令echo

使用起来-delete更快(没有多余的空间fork()execve()每个文件都没有),但这是有风险的,因为它-delete也可以作为条件,所以:

# delete *.tmp files
find . -type f -name '*.tmp' -delete

但是,如果您仅交换参数:

# delete ALL files
find . -type f -name '*.tmp' -delete

如果需要find并且rm可以处理大量文件,请查看find ... | xargs ... rmUNIX习惯用法。


4
我认为您的最后两个示例完全相同,可能需要更正!
slhck 2012年

1

您可以使用find命令轻松地执行此操作

$ find -type f

将结果限制为文件类型


1

我努力使用上面提供的脚本和其他一些脚本来做到这一点,特别是当文件和文件夹名称包含换行符或空格时。

最终偶然发现了tmpreaper,到目前为止,它对我们来说已经很好地工作了。

tmpreaper -t 5d ~/Downloads


tmpreaper  --protect '*.c' -t 5h ~/my_prg

原始来源链接

具有诸如test的功能,该功能可递归检查目录并列出目录。删除时可以删除符号链接,文件或目录以及某些模式的保护模式


0

为了加快命令的使用,'+'而不是\;

find /path/to/files* -type f -mtime +10 -exec rm '{}' '+'

它将rm仅在末尾运行一次,而不是在每次找到文件时运行一次。
rm由于命令行长度限制,如果您确实有大量文件,可能会运行几次,但这仍然几乎与使用一样快-delete


0

rm -f find /path/to/files -type file -mtime -5

这将删除5天内修改的文件

rm -f find /path/to/files -type file -mtime +5

这将删除前5天修改过的文件

在查找之前和`5之后的末尾使用`。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.