我正在尝试删除大量超过x天的文件。
现在我有一个脚本可以做到这一点
find /path/to/files* -mtime +10 -exec rm {} \;
但这也会删除子目录。有很多文件夹,但我想保留它们,并删除所说文件夹中10天以上的文件。
有没有办法做到这一点?
我正在尝试删除大量超过x天的文件。
现在我有一个脚本可以做到这一点
find /path/to/files* -mtime +10 -exec rm {} \;
但这也会删除子目录。有很多文件夹,但我想保留它们,并删除所说文件夹中10天以上的文件。
有没有办法做到这一点?
Answers:
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来解释取代的文件/目录名,就像我们保护用反斜杠分号。
find /path/to/files* -type f -mtime +10
,看看它会输出什么。
-exec
,请先查看它的发现。
-delete
参数find
,以删除所有文件和文件夹,仅当空时才删除后者。这意味着-depth
,即深度优先搜索。
-mindepth 1
以排除父目录。
与先前的答案一样(两者均为+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 ... rm
UNIX习惯用法。
rm -f find /path/to/files -type file -mtime -5
这将删除5天内修改的文件
rm -f find /path/to/files -type file -mtime +5
这将删除前5天修改过的文件
在查找之前和`5之后的末尾使用`。