用于删除早于n天的目录的Shell脚本

bob*_*bsr 154 bash shell

我的目录名为:

2012-12-12
2012-10-12
2012-08-08
Run Code Online (Sandbox Code Playgroud)

如何使用bash shell脚本删除超过10天的目录?

sam*_*hen 354

这将以递归方式为您执行:

find /path/to/base/dir/* -type d -ctime +10 -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

说明:

  • find:用于查找文件/目录/链接等的unix命令
  • /path/to/base/dir:开始搜索的目录.
  • -type d:只找到目录
  • -ctime +10:只考虑修改时间超过10天的那些
  • -exec ... \;:找到每个这样的结果,执行以下命令 ...
  • rm -rf {}:递归强制删除目录; 该{}部分是查找结果从前一部分替换的位置.

或者,使用:

find /path/to/base/dir/* -type d -ctime +10 | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)

哪个更有效率,因为它相当于:

rm -rf dir1 dir2 dir3 ...
Run Code Online (Sandbox Code Playgroud)

而不是:

rm -rf dir1; rm -rf dir2; rm -rf dir3; ...
Run Code Online (Sandbox Code Playgroud)

就像在-exec方法中一样.


对于现代版本find,您可以替换;with +,它将xargs为您执行相应的调用,传递适合每个exec系统调用的文件:

find . -type d -ctime +10 -exec rm -rf {} +
Run Code Online (Sandbox Code Playgroud)

  • `-mtime`对我来说更好,因为它检查内容更改而不是权限更改,否则这是完美的. (11认同)
  • 您可以使用-maxdepth 1来忽略目录的内容 (9认同)
  • 我认为这也将删除基础目录本身 (7认同)
  • 如果要删除的文件夹太多,效率更高的方法可能会适得其反:http://stackoverflow.com/questions/11289551/argument-list-too-long-error-for-rm-cp-mv-commands.出于同样的原因,为了避免删除基础文件夹,最好使用`-mindepth 1`(而不是`/ path/to/folder/*`). (7认同)
  • @OrGal你是绝对正确的.为了防止这种情况,只需使用:`find/path/to/base/dir/*`. (3认同)
  • 这有效,但带有消息:base dir 'No such file or directory' (3认同)
  • 除非你想等待永恒,否则你需要-maxdepth 1. (2认同)
  • 如果您执行“find /path/to/base/dir/* -maxdepth 1”,那么您最终会考虑/path/to/base/dir/a/b 中的“b”等目录。`-maxdepth 0` 不起作用,因为它只考虑 cli args,所以我认为解决方案是 `find /path/to/base/dir -maxdepth 1 -mindepth 1` (2认同)

小智 39

如果你想删除所有子目录下/path/to/base,例如

/path/to/base/dir1
/path/to/base/dir2
/path/to/base/dir3
Run Code Online (Sandbox Code Playgroud)

但你不想删除root /path/to/base,你必须添加-mindepth 1-maxdepth 1选项,这将只访问下的子目录/path/to/base

-mindepth 1/path/to/base从比赛中排除根.

-maxdepth 1匹配立即下的子目录/path/to/base,如/path/to/base/dir1,/path/to/base/dir2/path/to/base/dir3,但不会列出这些子目录递归的方式.因此,不会列出这些示例子目录:

/path/to/base/dir1/dir1
/path/to/base/dir2/dir1
/path/to/base/dir3/dir1
Run Code Online (Sandbox Code Playgroud)

等等.

因此,要删除/path/to/base超过10天的所有子目录;

find /path/to/base -mindepth 1 -maxdepth 1 -type d -ctime +10 | xargs rm -rf
Run Code Online (Sandbox Code Playgroud)


Ond*_*žka 18

find支持-delete操作,所以:

find /base/dir/* -ctime +10 -delete;
Run Code Online (Sandbox Code Playgroud)

我认为有一个问题,文件也需要10天以上.没试过,有人可能会在评论中确认.

这里投票最多的解决方案是丢失的,-maxdepth 0所以rm -rf在删除之后它会调用每个子目录.这没有意义,所以我建议:

find /base/dir/* -maxdepth 0  -type d -ctime +10 -exec rm -rf {} \;
Run Code Online (Sandbox Code Playgroud)

-delete上面的解决方案没有使用-maxdepth 0因为find会抱怨dir不是空的.相反,它暗示-depth并从下往上删除.