当 find 产生一个文件列表时,该列表提供给另一个命令有时是很有用的.
案例:

$touch abc.c erd.c oiy.c
$ll
./erd.c
./abc.c
./oiy.c
$find -name '*.c'| rm
rm: 缺少操作数
请尝试执行"rm --help"来获取更多信息。
$find -name '*.c'| xargs rm
$find -name '*.c'

无任何显示,说明已成功删除.

  1. 简介,之所以能用到这个命令,关键是由于很多命令不支持管道(|)来传递参数,而日常工作中有这个必要,所以就有了 xargs 命令,如上例.
    xargs 可以读入 stdin 的资料,并且以空白子元或断行子元作为分辨,将 stdin 的资料分隔成为 atguments,因为是以空白子元作为分隔,所以,如果有一些文件名或者其他有意义的名词内含空白子元的时候,xargs 就可能会出现误判了.
$touch 'file 1.log' ‘file 2.log’
$ll
总用量 0
-rw-r--r-- 1 root root 0 7月 13 10:18 file 1.log
-rw-r--r-- 1 root root 0 7月 13 10:18 file 2.log
$find -name '*.log'
./file 2.log
./file 1.log
$find -name '*.log' | xargs rm
rm: 无法删除"./file": 没有那个文件或目录
rm: 无法删除"2.log": 没有那个文件或目录
rm: 无法删除"./file": 没有那个文件或目录
rm: 无法删除"1.log": 没有那个文件或目录

原因很简单,xargs 默认是以空白字符(空格,tab,换行符)来分割记录的,因此文件名 ./file 1.log 被解释成了两个记录./file 和 1.log,不幸的是 rm 找不到这两个文件.
为了解决此类问题,聪明的人类想出了一个办法,让 find 在打印出一个文件名之后接着输出一个 null 字符(‘ ’)而不是换行符,然后再告诉 xargs 也用 null 字符来作为记录的分隔符,这就是 find 的-print 和 xargs 的-0 选项.
$find -name '*.log' -print0 | xargs -0 rm

  1. 主要选项
选项 含义
-0 当 stdin 含有特殊子元的时候,将其当成一般字符
-a file 从文件中读入作为 stdin
-e flag 注意有的时候可能会是-E,flag 必须是一个以空格分割的标志,当 xargs 分析到含有 flag 这个标志的时候就停止
-p 当每次执行一个 argument 的时候咨询问一次用户.
-n num 后面加次数,表示命令在执行的时候一次用 arguments 的个数,默认是用所有的.
-t 便是先打印命令,然后在执行
-i 或者是-I,将 xargs 的每项名称,一般是一行一行的赋值给{},可以用{}代替
-r no-run-if-enpty 当 xargs 的输入为空的时候则停止 xargs,不用再去执行了
-s num 命令行的最大字符数
-d delim 分隔符,默认的 xargs 分隔符是回车,argument 的分隔符是空格,这里修改的是 xargs 的分隔符
-x exit 的意思,主要是匹配-s 使用
-P 修改最大的进程数,默认是 1,为 0 的时候 as mang as it can

find -print 和-print0 的区别:
-print 每一个输出后会添加一个回车换行符,而-print0 则不会.

======================

http://blog.sina.com.cn/s/blog_5611597901019nye.html

find中的-print0和xargs中-0的奥妙

(2012-11-28 15:21:01)

标签:

find

xargs

it

分类: Shell

默认情况下, find 每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的 find 的输出都是一行一行的:

[bash-4.1.5] ; ls -l

total 0

-rw-r--r-- 1 root root 0 2010-08-02 18:09 file1.log

-rw-r--r-- 1 root root 0 2010-08-02 18:09 file2.log

[bash-4.1.5] ; find -name '*.log'

./file2.log

./file1.log

比如我想把所有的 .log 文件删掉, 可以这样配合 xargs 一起用:

[bash-4.1.5] ; find -name '*.log'

./file2.log

./file1.log

[bash-4.1.5] ; find -name '*.log' | xargs rm

[bash-4.1.5] ; find -name '*.log'

嗯, 不错, find+xargs 真的很强大. 然而:

[bash-4.1.5] ; ls -l

total 0

-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log

-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log

[bash-4.1.5] ; find -name '*.log'

./file 1.log

./file 2.log

[bash-4.1.5] ; find -name '*.log' | xargs rm

rm: cannot remove `./file': No such file or directory

rm: cannot remove `1.log': No such file or directory

rm: cannot remove `./file': No such file or directory

rm: cannot remove `2.log': No such file or directory

原因其实很简单, xargs 默认是以空白字符 (空格, TAB, 换行符) 来分割记录的, 因此文件名 ./file 1.log 被解释成了两个记录 ./file 和 1.log, 不幸的是 rm 找不到这两个文件.

为了解决此类问题, 聪明的人想出了一个办法, 让 find 在打印出一个文件名之后接着输出一个 NULL 字符 ('\0')而不是换行符, 然后再告诉 xargs 也用 NULL 字符来作为记录的分隔符. 这就是 find 的 -print0 和 xargs 的-0 的来历吧.

[bash-4.1.5] ; ls -l

total 0

-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 1.log

-rw-r--r-- 1 root root 0 2010-08-02 18:12 file 2.log

[bash-4.1.5] ; find -name '*.log' -print0 | hd

0  1  2  3   4  5  6  7   8  9  A  B   C  D  E  F  |0123456789ABCDEF|

--------+--+--+--+--+---+--+--+--+---+--+--+--+---+--+--+--+--+----------------|

00000000: 2e 2f 66 69  6c 65 20 31  2e 6c 6f 67  00 2e 2f 66  |./file 1.log../f|

00000010: 69 6c 65 20  32 2e 6c 6f  67 00                     |ile 2.log.      |

[bash-4.1.5] ; find -name '*.log' -print0 | xargs -0 rm

[bash-4.1.5] ; find -name '*.log'

你可能要问了, 为什么要选 '\0' 而不是其他字符做分隔符呢? 这个也容易理解: 一般的编程语言中都用 '\0' 来作为字符串的结束标志, 文件的路径名中不可能包含 '\0' 字符.

以上转自:http://blog.163.com/laser_meng@126/blog/static/16972784420117102638257/

其他我收集的find、xargs实例:

删除以html结尾的10天前的文件,包括带空格的文件:

find /usr/local/backups -name "*.html" -mtime +10 -print0 |xargs -0 rm -rfv

find /usr/local/backups -mtime +10 -name "*.html" -exec rm -rf {} \;

find -print 和 -print0的区别:

-print 在每一个输出后会添加一个回车换行符,而-print0则不会。

当前目录下文件从大到小排序(包括隐藏文件),文件名不为".":

find . -maxdepth 1 ! -name "." -print0 | xargs -0 du -b | sort -nr | head -10 | nl

nl:可以为输出列加上编号,与cat -n相似,但空行不编号

以下功能同上,但不包括隐藏文件:

for file in *; do du -b "$file"; done|sort -nr|head -10|nl

xargs结合sed替换:

find . -name "*.txt" -print0 | xargs -0 sed -i 's/aaa/bbb/g'

xargs结合grep:

find . -name '*.txt' -type f -print0 |xargs -0 grep -n 'aaa'    #“-n”输出行号

shell 学习四十五天---xargs的更多相关文章

  1. shell学习四十九天----进程建立

    进程 前言:进程指的是运行中程序的一个实例.新进程由fork()与execve()等系统调用所起始,然后运行,知道他们下达exit()系统调用为止. linux系统都支持多进程.尽管计算机看起来像是一 ...

  2. shell学习四十天----awk的惊人表现

    awk的惊人表现 awk能够胜任差点儿全部的文本处理工作.     awk 调用 1.调用awk: 方式一:命令行方式 awk [-F field-separator ] 'commands' inp ...

  3. “全栈2019”Java第四十五章:super关键字

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  4. 孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备

     孤荷凌寒自学python第四十五天Python初学基础基本结束的下阶段预安装准备 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 今天本来应当继续学习Python的数据库操作,但根据过去我自 ...

  5. (十四--十五)数据库查询优化Part I

    (十四--十五)数据库查询优化Part I 如果理解的有问题.欢迎大家指出.这也是我在看课记得笔记..可能会有很多问题 查询优化的重要性 请记住用户只会告诉DMBS他们想要什么样的结果,而不会告诉他们 ...

  6. NeHe OpenGL教程 第四十五课:顶点缓存

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  7. Gradle 1.12用户指南翻译——第四十五章. 应用程序插件

    本文由CSDN博客貌似掉线翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  8. SQL注入之Sqli-labs系列第四十一关(基于堆叠注入的盲注)和四十二关四十三关四十四关四十五关

    0x1普通测试方式 (1)输入and1=1和and1=2测试,返回错误,证明存在注入 (2)union select联合查询 (3)查询表名 (4)其他 payload: ,( ,( 0x2 堆叠注入 ...

  9. python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)

    python3.4学习笔记(十五) 字符串操作(string替换.删除.截取.复制.连接.比较.查找.包含.大小写转换.分割等) python print 不换行(在后面加上,end=''),prin ...

随机推荐

  1. 12.python进程\协程\异步IO

    进程 创建进程 from multiprocessing import Process import time def func(name): time.sleep(2) print('hello', ...

  2. 配置apache的文件访问路径

    本例中,我们让apache访问"F:/testObject/php"路径: 一.修改http.conf文件配置 访问路径:"apache/conf/httpd.conf& ...

  3. 对RC4算法进行改写,新的加密算法RCX。

    最近研究JWT算法, JWT由header.payload.signature三个部分组成,payload是非加密的,一些敏感信息能被别人非法获得,必要时候要加密. 加密算法中,RC4算法的速度可以达 ...

  4. 记一次电信反射xss的挖掘与利用

    0X0.前言 早上起床,打开手机习惯性刷刷新闻,却发现网络无法连接,本以为是光猫出现了问题,后来发现是忘记续费,欠费了. 在网上充值完之后,等了有将近十分钟,网依旧没恢复.随打了个电话给客服,客服在后 ...

  5. opencv提供的带参数例程

    body { font-family: @微软雅黑; font-size: 8pt; line-height: 1.5 } html,body { color: inherit; background ...

  6. VFS四大对象之三 struct dentry

    继上一篇文章介绍了inode结构体:继续介绍目录项dentry: http://www.cnblogs.com/linhaostudy/p/7427794.html 三.dentry结构体 目录项:目 ...

  7. 关于soapui简介与入门

    SoapUI简介 SoapUI是一个开源测试工具,通过soap/http来检查.调用.实现Web Service的功能/负载/符合性测试.该工具既可作为一个单独的测试软件使用,也可利用插件集成到Ecl ...

  8. Codeforces 839D Winter is here【数学:容斥原理】

    D. Winter is here time limit per test:3 seconds memory limit per test:256 megabytes input:standard i ...

  9. Codeforces Round #412 (rated, Div. 2, base on VK Cup 2017 Round 3)(A.B.C,3道暴力题,C可二分求解)

    A. Is it rated? time limit per test:2 seconds memory limit per test:256 megabytes input:standard inp ...

  10. train problem I (栈水题)

    杭电1002http://acm.hdu.edu.cn/showproblem.php?pid=1022 Train Problem I Time Limit: 2000/1000 MS (Java/ ...