2009-01-12 55 views
3

今天我注意到(大约8年高兴地砍掉bash后),没有使用'rm''按日期删除'的无效方法。因此,解决方案是围绕像rm,ls,find,awk和sed这样的命令组合管道。在bash中是否有使用'rm''按日期删除'的简单方法?

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

我想出了以下内容,这是对接丑,如果“RM”设置为跳过目录(否则你会删除父目录)应只运行:

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

要点无论是最优雅和最过分的过度设计的解决方案。

+0

什么是“l”,在管道的开头? “ls -l”的别名? – unwind 2009-01-12 09:04:21

+0

哎呀,是别名'ls -la' – Fergie 2009-01-12 09:07:15

回答

8

发现的某些版本找到支持-delete选项,使之更有效率......

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

检查发现手册页(这对大多数工作我的Ubuntu最近的版本)

10

我将结合查找和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 \{\} \; 

警告:这只是今天的工作:-)。 (要使其每次都能工作,请用absoulte时间替换-ctime,请参阅联机帮助页中的timeXY)

+0

示例:http://www.howtogeek。com/howto/ubuntu/delete-files-old-than-x-days-on-linux/ – OIS 2009-01-12 09:14:45

1

find(1)比解析ls(1)输出更有效。

编辑:东西留意是文件名包含空格,所以你想有一个find支持-print0(与xargs -0使用)获得更好的性能。

find . -mtime +12 -print0 | xargs -0 rm -f 
1

而不是解析LS(1),它可以很容易打破你应该依靠统计(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 

注意:这不会正确处理带有嵌入换行符的文件名。但是他们很少在wil.d

3

我会用:

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

(或-newermt,如果你想在修改时间筛选)

请注意,-newerXY的't'形式将涉嫌允许任何日期格式与cvs兼容(请参阅doco)。

相关问题