我试图找出其删除超过15天的SQL文件的命令。
这一发现部分工作,但不是RM。
rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \( -name '*.sql' \) -mtime +15
它踢出来的正是我想要删除的文件列表,但不会删除它们。 该路径是正确的。
usage: rm [-f | -i] [-dIPRrvW] file ...
unlink file
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120601.backup.sql
...
/usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/20120610.backup.sql
我究竟做错了什么?
你实际上是管道rm
的输出输入find
。 你想要的是使用的输出find
作为参数传递给rm
:
find -type f -name '*.sql' -mtime +15 | xargs rm
xargs
是命令“皈依”的标准输入到另一个程序的参数,或者,因为它们更准确地把它的上man
页,
构建和执行从标准输入命令行
请注意,如果文件名可以包含空格字符,你应该纠正为:
find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm
但实际上, find
有这样一个快捷方式:在-delete
选项:
find -type f -name '*.sql' -mtime +15 -delete
请注意下面的警告的man find
:
Warnings: Don't forget that the find command line is evaluated
as an expression, so putting -delete first will make find try to
delete everything below the starting points you specified. When
testing a find command line that you later intend to use with
-delete, you should explicitly specify -depth in order to avoid
later surprises. Because -delete implies -depth, you cannot
usefully use -prune and -delete together.
PS注意,直接输送至rm
是不是一种选择,因为rm
预计不会对标准输入文件名。 目前,什么你正在做的是倒退管道它们。
find /usr/www/bar/htdocs -mtime +15 -exec rm {} \;
将选择的文件/usr/www/bar/htdocs
超过15天以上,并删除它们。
另一种更简单的方法是使用locate
命令。 然后,管结果xargs
。
例如,
locate file | xargs rm
假设你是不是在包含* .SQL备份文件的目录:
find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;
上述-v选项是很方便它将其冗长,因为他们被删除的文件被删除输出。
我想列出将首先被删除,以确保文件。 例如:
find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;