unix – 命令行:pipe查找结果到rm

前端之家收集整理的这篇文章主要介绍了unix – 命令行:pipe查找结果到rm前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图制定一个命令,删除sql文件15天以上。

找到部分是工作,但不是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是将其标准输入转换为另一个程序的参数的命令,或者,它们更准确地将其放在手册页上,

build and execute command lines from standard input

请注意,如果文件名可以包含空格字符,您应该纠正:

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不需要标准输入上的文件名。你目前在做什么是管道他们向后。

猜你在找的Bash相关文章