命令行:管道发现结果RM(Command line: piping find results to

2019-06-25 18:09发布

我试图找出其删除超过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

我究竟做错了什么?

Answer 1:

你实际上是管道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预计不会对标准输入文件名。 目前,什么你正在做的是倒退管道它们。



Answer 2:

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

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



Answer 3:

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

例如,

locate file | xargs rm


Answer 4:

假设你是不是在包含* .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 {} \;


文章来源: Command line: piping find results to rm