2013-02-22 102 views
2

我有一个包含大量文件的目录。我只想保留最新的6个。我想我可以看看他们的创建日期,并在所有那些太旧的版本上运行rm,但这是做这个更好的方法吗?也许我可以使用一些Linux命令?在shell脚本中按日期删除文件?

谢谢!

:)

+0

查看'find'。 – squiguy 2013-02-22 08:14:46

+0

'find/my/path -type f -mtime +6 -exec rm {} \;'看起来怎么样? – user1856596 2013-02-22 08:15:46

+1

不好。如果最后6个文件在6天之前更新,它们全部被删除。如果最近6天创建了十亿个文件,则不会被删除。另外,'-delete'比'-exec rm P {] \;' – sehe 2013-02-22 08:17:10

回答

5
rm -v $(ls -t mysvc-*.log | tail -n +7) 
  • ls -t,清单按时间
  • tail -n +7排序,+7这里指长度7,让所有,但第一个7行
  • $()使得来自封闭命令输出的字符串列表
  • rm删除文件,当然
  • 小心他们的名字中有空格的文件,$()在任何空格上分裂!
+0

你能解释一下这个命令吗?我不是Linux专业版:)。谢谢 – user1856596 2013-02-22 08:24:01

+1

谢谢@JanHudec :) @ user1856596虽然在这里要注意带有空白字符(或其他的游戏名称)的文件名:'find'命令在实践中将会很安全_safer_ – sehe 2013-02-22 09:37:18

0

这是我的承担,作为一个脚本。它确实处理文件名中的空格,即使它有点破解。

#!/bin/bash 

eval set -- $(ls -t1 | sed -e 's/.*/"&"/') 

if [[ $# -gt 6 ]] ; then 
    shift 6 
    while [[ $# -gt 0 ]] ; do 
     echo "remove this file: $1" # rm "$1" 
     shift 
    done 
fi 

第二个选项是每行一个文件名“1”。但实际上并不重要,因为当ls没有喂tty时,这似乎是默认的。