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


140

我正在尝试制定一个删除超过15天的sql文件的命令。

查找部分正在工作,但不起作用。

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

我究竟做错了什么?

Answers:


274

您实际上是将管道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在标准输入中不希望使用文件名。您当前正在做的是将它们反向传送。


1
谢谢。我阅读了手册页,并尝试了该标志。我正在传递完整路径,但返回“ / usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups /:相对路径可能不安全”。知道为什么吗?
jerrygarciuh 2012年

1
@jerrygarciuh 在这里看看。
Lev Levitsky

谢谢。我不确定我是否很好地遵循了这篇文章,但是当我模拟他们的解决方案并将-delete放在命令末尾时,无论mod时间如何,它都删除了所有的sql文件...但是它没有警告,所以我猜那是进步...
jerrygarciuh 2012年

1
@jerrygarciuh哎呀,我希望没有任何有价值的东西丢失…… man说: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.虽然您使用了其他选项,但我不确定这会如何,但是您尝试过吗?
Lev Levitsky

不,我没有,但是什么也没丢。这些文件是从另一台服务器上同步存储的。
jerrygarciuh 2012年

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

将选择/usr/www/bar/htdocs15天之前的文件并将其删除。


我比较喜欢您的答案,因为“名称中有空格”。使用“ -exec”命令比使用管道更好。谢谢。
Slim Aloui

3

另一个更简单的方法是使用locate命令。然后,将结果传送到xargs

例如,

locate file | xargs rm

2

假设您不在包含* .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 {} \;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.