命令行:pipe道findrm的结果

我试图找出一个删除超过15天的SQL文件的命令。

find部分是工作,但不是公司。

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f \( -name '*.sql' \) -mtime +15 

它列出了我想删除的文件,但不删除它们。 path是正确的。

 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的input。 你想要的是使用find的输出作为rm 参数

 find -type f -name '*.sql' -mtime +15 | xargs rm 

xargs是将其标准input“转换”为另一个程序的参数的命令,或者,因为它们更准确地将其放在man页上,

从标准input构build和执行命令行

请注意,如果文件名可以包含空格字符,则应该更正这一点:

 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不是一种select,因为rm不会在标准input上预期文件名。 你现在正在做的是把它们倒过来。

 find /usr/www/bar/htdocs -mtime +15 -exec rm {} \; 

将select超过15天的/usr/www/bar/htdocs文件并删除它们。

另一个更简单的方法是使用locate命令。 使用它xargs

例如,

 locate file.txt | xargs rm locate *something* | 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 {} \;