命令行:管道查找结果到rm [英] Command line: piping find results to rm

查看:240
本文介绍了命令行:管道查找结果到rm的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我试图找出一个命令删除超过15天的sql文件。找到部分正常工作,但不是rm。

  rm -f | find -L / usr / www2 / bar / htdocs / foo / rsync / httpdocs / db_backups -type f \(-name'* .sql'\)-mtime +15 

它会弹出一个列表,列出我要删除的文件,但不删除它们。路径是正确的。

 用法: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 作为 arguments rm



  find -type f -name'* .sql'-mtime +15 | xargs rm 

xargs 将其标准输入转换为另一个程序的参数,或者更准确地将其放在 man 页面上,



< blockquote>

从标准输入构建和执行命令行


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

  find -type f -name'* .sql'-mtime +15 -print0 | xargs -0 rm 

但实际上, find 有一个快捷方式: -delete 选项:

  find  - 键入f -name'* .sql'-mtime +15 -delete 

请注意以下警告 man find

 警告: t忘记find命令行被评估
作为表达式,所以放置-delete首先会使找到尝试
删除所有下面的起点你指定。当
测试一个find命令行,你以后打算使用
-delete,你应该显式指定-depth为了避免
以后的惊喜。因为-delete意味着-depth,你不能
有用地使用-prune和-delete在一起。

请注意,直接连接到 rm 不是一个选项,因为 rm 不需要标准输入上的文件名。你目前正在做的是将它们倒回来。


I'm trying to work out a command which deletes sql files older than 15 days.

The find part is working but not the rm.

rm -f | find -L /usr/www2/bar/htdocs/foo/rsync/httpdocs/db_backups -type f  \( -name '*.sql' \) -mtime +15

It kicks out a list of exactly the files I want deleted but is not deleting them. The paths are correct.

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

What am I doing wrong?

解决方案

You are actually piping rm's output to the input of find. What you want is to use the output of find as arguments to rm:

find -type f -name '*.sql' -mtime +15 | xargs rm

xargs is the command that "converts" its standard input into arguments of another program, or, as they more accurately put it on the man page,

build and execute command lines from standard input

Note that if file names can contain whitespace characters, you should correct for that:

find -type f -name '*.sql' -mtime +15 -print0 | xargs -0 rm

But actually, find has a shortcut for this: the -delete option:

find -type f -name '*.sql' -mtime +15 -delete

Please be aware of the following warnings in 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. Note that piping directly to rm isn't an option, because rm doesn't expect filenames on standard input. What you are currently doing is piping them backwards.

这篇关于命令行:管道查找结果到rm的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆