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

时间:2012-06-25 14:40:53

标签: unix command-line find 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

我做错了什么?

5 个答案:

答案 0 :(得分:232)

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

<子> P.S。请注意,直接向rm滚动不是一个选项,因为rm不期望标准输入上的文件名。你目前正在做的是向后管道。

答案 1 :(得分:24)

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

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

答案 2 :(得分:2)

另一种更简单的方法是使用locate命令。然后,将结果传递给xargs

例如,

locate file | xargs rm

答案 3 :(得分:0)

假设您不在包含* .sql备份文件的目录中:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec rm -v {} \;

上面的-v选项很方便,它会详细输出哪些文件在删除时被删除。

我想首先列出要删除的文件以确定。 E.g:

find /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups/*.sql -mtime +15 -exec ls -lrth {} \;

答案 4 :(得分:0)

使用 xargs 传递参数,使用选项 -rd '\n' 忽略名称中的空格:

<块引用>

"${command}" | xargs -rd '\n' rm

如果您还想删除只读文件,请包括 --force