删除在特定日期之前创建的所有文件


26

我的目录中包含大量文件(例如一年中的每一天的日志)。我想删除22/11之前创建的所有文件。我该如何实现?我必须使用findthen exec -rm吗?我正在使用ksh。


1
通常的警告是,Unix文件系统通常不包含创建文件的时间的记录-只有索引节点和内容的最后修改时间可用。
Toby Speight 2016年

Answers:


35

使用find仍然是删除文件的首选方法。有关更多信息,请参见http://mywiki.wooledge.org/UsingFind

一种方法是创建一个带有时间戳的文件。例如

touch -t 201311220000 /tmp/timestamp

现在,删除与find时间戳匹配的文件GNU (假定在当前目录中),例如:

find . -type f ! -newer /tmp/timestamp -delete  

还是非GNU查找

find . -type f ! -newer /tmp/timestamp -exec rm {} \;

2
那这个呢 ?它行得通吗?找到-type f -mtime +5 -exec rm -f {} \;
user1058398 2013年

1
@ user1058398从现在开始将删除5天之前的文件。
Valentin Bajrami 2013年

它也会同时删除文件夹和文件吗?@ val0x00ff
alper

1
@Avatar否,因为将操作type -f限制为仅文件。
Valentin Bajrami

22

使用GNU或某些BSD find

find . ! -newermt 2013-11-22 ! -type d -delete

请注意,它会检查文件的最后修改时间。在某些BSD上,可以使用-newerBt代替-newermt检查文件的inode 生成时间。


1
find /path/to/directory/ -mtime +<number of days> -name '<file name>' -exec rm -rf {} \;

例:

find /Netap_fileshare_backup/SQL/DB_backups/xeo/ -mtime +15 -name 'ORA_XEO*' -exec rm -rf {} \;

在这种情况下,它将删除所有以“ ORA_XEO”开头超过15天的文件。


尽管最好使用来监视它rm -rf,但是第一个命令将删除所有早于15天的目录中包含的所有内容。(还有,为什么要加上括号-name?)
ilkkachu

没错,我们不需要输入“(”“)”。

但是,如果我们要添加条件,则可能会很有用。例如,如果我们要删除所有以“ .jar”或“ .cp”结尾的文件,并以“ ex”开头。 example.jar-将被移除example.cp-将被移除 example.tar-将不会被移除
卡拉夫特(Cafate)

在这种情况下,我们可以使用:find /path/to/directory/ -mtime +<number of days> \( -name '*.jar' -o -name '*.cp' \) -name 'ex*' -exec rm -rf {} \;
af灭

这将删除<天数>中的某些文件,而不是所有早于<天数>的文件,除非您确切地在午夜运行它并在一秒钟内完成。对于GNU,find您应该使用-daystart修饰符将-mtime值强制为午夜。
roaima
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.