8

我今天注意到(在愉快地使用 bash 大约 8 年之后)没有使用“rm”“按日期删除”的简单方法。因此,解决方案是围绕 rm、ls、find、awk 和 sed 等命令组合进行管道传输。

例如,我想从 2009 年删除工作目录中的每个文件,典型的方法是什么?

我想出了以下内容,这很丑陋,只有在将“rm”设置为跳过目录时才应该运行(否则您将删除父目录):

ls -la | awk '{if (substr($6,0,5)==2009) print $8}' | xargs rm

最优雅和最过分设计的解决方案都得分。

4

5 回答 5

11

我会结合 find 和 rm (没有管道)

find .  ...bunch of find criterias to select certain files (e.g. by date) .... -exec rm \{\} \;

编辑:使用您的示例的参数,它将是

find . -maxdepth 1 -type f -ctime -12 -exec rm \{\} \;

警告:这仅在今天有效:-)。(为了让它每次都能正常工作,请将 -ctime 替换为绝对时间,参见手册页中的 timeXY )

于 2009-01-12T09:06:55.817 回答
10

某些版本的 find 支持 -delete 选项,使其更加高效...

find . -maxdepth 1 -type f -ctime -12 -delete;

检查您的查找手册页(这对我来说适用于最新版本的 Ubuntu)

于 2009-01-12T09:32:39.883 回答
3

我会使用:

find . -maxdepth 1 -type f -newerct 'jan 1' -print0 \
    | xargs -0 rm

(或者-newermt如果你想过滤修改时间)

请注意,-newerXY 的“t”形式据称允许任何与 cvs 兼容的日期格式(请参阅doco)。

于 2009-01-12T09:33:02.643 回答
1

find(1)做你想做的事情比解析ls(1)输出更有效率。

编辑:要注意的是其中包含空格的文件名,因此您想要一个find支持-print0(与 一起使用xargs -0)以获得更好的性能。

find . -mtime +12 -print0 | xargs -0 rm -f
于 2009-01-12T09:17:20.117 回答
1

而不是解析很容易破坏的ls(1),你应该依赖stat(1):

stat -c '%z/%n' files_or_glob | grep '^date' | cut -d/ -f2- | xargs -d '\n' rm -i

例如

$ stat -c '%z/%n' *| grep '^2008-12-16' | cut -d/ -f2- | xargs -d '\n' rm -i

注意:这不会正确处理嵌入换行符的文件名。然而,它们很少在野外发现

于 2009-01-12T09:32:08.027 回答