删除目录中的旧文件

时间:2013-11-21 19:31:31

标签: linux bash

好吧也许这听起来很简单,但对我来说有点挑战

我有一个名为backups的目录,它有(备份文件+其他文件)

备份文件:

../backups/backup-2013_03_03.zip
../backups/backup-2013_03_05.zip
../backups/backup-2013_01_01.zip
../backups/backup-2013_08_16.zip
../backups/backup-2013_02_28.zip
../backups/backup-2013_01_21.zip
../backups/backup-2013_03_29.zip
../backups/backup-2013_04_05.zip

我正在尝试删除超过90天的备份文件。

 find /var/tmp/stuff -mtime +90 -print | xargs /bin/rm

似乎有效,但我无法将搜索限制为仅备份文件。 “以备份开头的文件*”

我已经尝试添加“-iname backup”选项来查找命令参数,认为它可以做到这一点,但它似乎不起作用。 有任何想法吗?

谢谢

3 个答案:

答案 0 :(得分:3)

iname的参数与完整文件名匹配,因此您需要一个尾随通配符:

find /var/tmp/stuff -mtime +90 -iname "backup*" -print | xargs /bin/rm

您也可以使用find的-exec参数,但我个人认为语法非常神秘。我更喜欢xargs。 find /var/tmp/stuff -mtime +90 -iname "backup*" -exec /bin/rm '{}'

或者,正如damienfrancois指出的那样,GNU find可以采用-delete参数。这是最好的解决方案,因为a)它更短,b)它更有效,因为删除发生在find过程中。 execxargs将为每个要删除的文件生成一个新进程。来源:GNU manual但是,正如wildplasser指出的那样,它也可能是危险的 - -delete默认会删除目录。要仅删除文件,请使用-type f

find /var/tmp/stuff -type f -mtime +90 -iname "backup*" -delete

答案 1 :(得分:3)

你可以在调用rm之前通过grep管道。类似的东西:

find /var/tmp/stuff -mtime +90 -print | grep 'backup-' | xargs /bin/rm

虽然find实用程序有单独的各种选项,包括删除,如其他答案中所述,我永远不会记住任何,但最基本的选项。

find "stuff" | grep "some_other_stuff" | xargs "do_stuff"

对我来说似乎更容易记住。

答案 2 :(得分:2)

您可以使用-exec的{​​{1}}选项和find。由于您只想删除文件,因此需要指定-iname

-type f

如果您喜欢像我这样的find /var/tmp/stuff -type f -iname 'backup*' -mtime +90 -exec rm {} +

xargs

注意:建议find /var/tmp/stuff -type f -iname 'backup*' -mtime +90 -print0 | xargs -0 rm find -print0一起使用以避免奇怪的文件名警告