命令行: 将查找结果管道化到 rm

我正在尝试编写一个命令来删除超过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

我做错了什么?

110230 次浏览

您实际上是将 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.

注意,直接管道到 rm不是一个选项,因为 rm不期望标准输入上有文件名。您目前正在做的是将它们反向管道输送。

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

将在 /usr/www/bar/htdocs中选择超过15天的文件并删除它们。

另一种更简单的方法是使用 locate命令。

比如说,

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 {} \;

使用 Xargs传递参数,选项 没错忽略名称中的空格:

“ ${ command }”| xargs-rd’n’rm

如果您还想删除只读文件,请包括 力量