http://www.centrue.me/2011/09/01/linux-xargs-find/

Linux中xargs的用法

Posted on  September 1, 2011

仅对上文FIND用法进行补充.完全看不懂,只有最下面一句能用得到:

xargs

大多数 Linux 命令都会产生输出:文件列表、字符串列表等。但如果要使用其他某个命令并将前一个命令的输出作为参数该怎么办?例如,file 命令显示文件类型(可执行文件、ascii 文本等);您可以处理输出,使其仅显示文件名,现在您希望将这些名称传递给 ls -l 命令以查看时间戳记。xargs 命令就是用来完成此项工作的。它允许您对输出执行其他某些命令。

xargs – build and execute command lines from standard input

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

记住下面这个来自于第 1 部分中的语法:

file -Lz * | grep ASCII | cut -d”:” -f1 | xargs ls -ltr

让我们来剖析这个命令字符串。第一个,file -Lz *,用于查找是符号链接或者经过压缩的文件。它将输出传递给下一个命令 grep ASCII,该命令在其中搜索 “ASCII” 字符串并产生如下所示的输出:
alert_DBA102.log: ASCII English text
alert_DBA102.log.Z: ASCII text (compress’d data 16 bits)
dba102_asmb_12307.trc.Z: ASCII English text (compress’d data 16 bits)
dba102_asmb_20653.trc.Z: ASCII English text (compress’d data 16 bits)

由于我们只对文件名感兴趣,因此我们应用下一个命令 cut -d”:” -f1,仅显示第一个字段:
alert_DBA102.log
alert_DBA102.log.Z
dba102_asmb_12307.trc.Z
dba102_asmb_20653.trc.Z

现在,我们希望使用 ls -l 命令,将上述列表作为参数进行传递,一次传递一个。xargs 命令允许您这样做。最后一部分,xargs ls -ltr,用于接收输出并对其执行 ls -ltr 命令,如下所示:

ls -ltr alert_DBA102.log
ls -ltr alert_DBA102.log.Z
ls -ltr dba102_asmb_12307.trc.Z
ls -ltr dba102_asmb_20653.trc.Z

因此,xargs 本身虽然没有多大用处,但在与其他命令相结合时,它的功能非常强大。

下面是另一个示例,我们希望计算这些文件中的行数:

$ file * | grep ASCII | cut -d”:” -f1 | xargs wc -l
47853 alert_DBA102.log
19 dba102_cjq0_14493.trc
29053 dba102_mmnl_14497.trc
154 dba102_reco_14491.trc
43 dba102_rvwr_14518.trc
77122 total

(注:上述任务还可用以下命令完成:)

$ wc -l ‘file * | grep ASCII | cut -d”:” -f1 | grep ASCII | cut -d”:” -f1‘

该 xargs 版本用于阐释概念。Linux 可以用几种方法来完成同一个任务;请使用最适合您的情况的方法。

使用该方法,您可以快速重命名目录中的文件。

$ ls | xargs -t -i mv {} {}.bak

-i 选项告诉 xargs 用每项的名称替换 {}。-t 选项指示 xargs 先打印命令,然后再执行。

另一个非常有用的操作是当您使用 vi 打开要编辑的文件时:

$ file * | grep ASCII | cut -d”:” -f1 | xargs vi

该命令使用 vi 逐个打开文件。当您希望搜索多个文件并打开它们进行编辑时,使用该命令非常方便。

它还有几个选项。最有用的可能是 -p 选项,它使操作具有可交互性:

$ file * | grep ASCII | cut -d”:” -f1 | xargs -p vi
vi alert_DBA102.log dba102_cjq0_14493.trc dba102_mmnl_14497.trc dba102_reco_14491.trc dba102_rvwr_14518.trc ?…

此处的 xarg 要求您在运行每个命令之前进行确认。如果您按下 “y”,则执行命令。当您对文件进行某些可能有破坏且不可恢复的操作(如删除或覆盖)时,您会发现该选项非常有用。

-t 选项使用一个详细模式;它显示要运行的命令,是调试过程中一个非常有帮助的选项。

如果传递给 xargs 的输出为空怎么办?考虑以下命令:

$ file * | grep SSSSSS | cut -d”:” -f1 | xargs -t wc -l
wc -l
0
$

在此处,搜索 “SSSSSS” 后没有匹配的内容;因此 xargs 的输入均为空,如第二行所示(由于我们使用 -t 这个详细选项而产生的结果)。虽然这可能会有所帮助,但在某些情况下,如果没有要处理的内容,您可能希望停止 xargs;如果是这样,可以使用 -r 选项:
$ file * | grep SSSSSS | cut -d”:” -f1 | xargs -t -r wc -l
$

如果没有要运行的内容,该命令退出。

假设您希望使用 rm 命令(该命令将作为 xargs 命令的参数)删除文件。然而,rm 只能接受有限数量的参数。如果您的参数列表超出该限制怎么办?xargs 的 -n 选项限制单个命令行的参数个数。

下面显示了如何限制每个命令行仅使用两个参数:即使向 xargs ls -ltr 传递五个文件,但每次向 ls -ltr 仅传递两个文件。

$ file * | grep ASCII | cut -d”:” -f1 | xargs -t -n2 ls -ltr
ls -ltr alert_DBA102.log dba102_cjq0_14493.trc
-rw-r—– 1 oracle dba 738 Aug 10 19:18 dba102_cjq0_14493.trc
-rw-r–r– 1 oracle dba 2410225 Aug 13 05:31 alert_DBA102.log
ls -ltr dba102_mmnl_14497.trc dba102_reco_14491.trc
-rw-r—– 1 oracle dba 5386163 Aug 10 17:55 dba102_mmnl_14497.trc
-rw-r—– 1 oracle dba 6808 Aug 13 05:21 dba102_reco_14491.trc
ls -ltr dba102_rvwr_14518.trc
-rw-r—– 1 oracle dba 2087 Aug 10 04:30 dba102_rvwr_14518.trc

使用该方法,您可以快速重命名目录中的文件。

$ ls | xargs -t -i mv {} {}.bak

-i 选项告诉 xargs 用每项的名称替换 {}。

我需要将一个用.svn管理的项目改成由CVS来管理,因此,在导入整个项目到CVS中之前,我需要删除所有目录下以及子孙目录下的.svn目录及.svn目录下的的子目录和文件。我一直寻找一种最简单的方法,最后写了一个程序去干这事情。结果同事告诉我只需要一条指令就可以了:find -name ‘.svn’ |xargs rm -rf
这个教训非常惨重,我一生讨厌傻瓜,可那一刻发现自己是最大的傻瓜!

是的,虽然我们——至少是我,天天使用LINUX但是真的是在高效的使用这个系统吗?不,很多时候并没有花时间去研究它,使用一些固有愚蠢的方式和思维模式在使用这个系统。

1. 建立多级目录:

mkidr 指令用来建立目录,事实上,我们一直都是这么干的。但是在这么使用的时候我们并没有去看它的那些参数提供了哪些额外的功能.

mkidr -p /share/dragon ; 在根目录下建立share目录,并在/share目录下建立dragon目录。mkdir -p guicmd/{bin,lib,src,share/version,doc/{html,pdf,info,man}}
;用来建立一个复杂的项目目录树。

2.find 配合xargs使用:

find -name ‘.svn’ |xargs rm -rf ;这个不用说了,就是我前面提到的。
xargs更加象一个筛选器,将符合管道传递过来的文件名的内容一并处理掉,这是一个极度高效的方法。

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

以下内容来自:http://www.linuxsir.org/main/?q=node/137
三、xargs

xargs – build and execute command lines from standard input

在使用find命令的-exec选项处理匹配到的文件时, find命令将所有匹配到的文件一起传递给exec执行。但有些系统对能够传递给exec的命令长度有限制,这样在find命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是xargs命令的用处所在,特别是与find命令一起使用。

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
......

在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

$ find / -name "core" -print | xargs echo "" >/tmp/core.log

上面这个执行太慢,我改成在当前目录下查找

#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6

在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:

<code># ls -l
drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf

用grep命令在所有的普通文件中搜索hostname这个词:

# find . -type f -print | xargs grep "hostname"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:

# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your

注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

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

打包操作系统里,所有.sh文件到abc.tar。

1、操作系统里所有.sh文件,find的时候目录设定为"/",不要用"./"。
2、打包整个操作系统的.sh文件,一次性打包可能会因为文件过多发生覆盖,建议设置xargs的-n,tar时进行追加。

find / -name "*.sh" | xargs -n 100 tar -rvf abc.tar

This entry was posted in LINUX and tagged find, linux, xargs by admin. Bookmark the permalink.

ONE THOUGHT ON “LINUX中XARGS的用法”

  1. Pingback: LINUX 下查找指定时间的所有文件 | 迷途花开

linux xargs相关推荐

  1. linux xargs命令

    |--linux xargs命令 xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数, 也能够从文件的输出中读取 ...

  2. linux xargs命令_如何在Linux中使用xargs命令?

    linux xargs命令 The xargs command allows us to pass the output of one command as the input for another ...

  3. linux xargs cp,Linux xargs命令的使用

    1.功能: xargs可以将stdin中以空格或换行符进行分隔的数据,形成以空格分隔的参数(arguments),传递给其他命令.因为以空格作为分隔符,所以有一些文件名或者其他意义的名词内含有空格的时 ...

  4. linux xargs与管道的区别

    为什么要用xargs,问题的来源 在工作中经常会接触到xargs命令,特别是在别人写的脚本里面也经常会遇到,但是却很容易与管道搞混淆,本篇会详细讲解到底什么是xargs命令,为什么要用xargs命令以 ...

  5. linux xargs 给命令传递参数 组合多个命令

    简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: 这个命令是错误的 find /sbin -perm +700 |ls ...

  6. Linux xargs命令

    xargs命令是给其他命令传递参数的一个过滤器,也是组合多个命令的一个工具. 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数.通常Linux命令可以用 | 首尾相连,上一个命令的 st ...

  7. Linux xargs 命令

    2015-08-29 创建 1.概述 从标准输入中创建并且执行命令行. xargs 从标准输入中读取条目,使用空格(这样可以保护单双引号或者反斜杠)或者换行符分隔,并且执行(默认是 /bin/echo ...

  8. linux xargs

    我们可以用管道将一个命令的stdout(标准输出)重定向到另一个命令的stdin(标准输入).例如: cat foo.txt | grep "test" 但是,有些命令只能以命令行 ...

  9. Linux xargs 用法详解

    1. 简介 之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如: find /sbin -perm +700 |ls -l     ...

最新文章

  1. linux配置usb主从_一种Linux下USB设备主从切换的实现
  2. element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
  3. okex java sdk_OKEX官网新手使用教程
  4. 关于小范围整数N拆解成2的幂相加的个数
  5. python一个对象只能被一个变量引用吗_Python中的变量、对象、引用
  6. Windows 下安装Python包(Numpy)的错误:Unable to find vcvarsall.bat
  7. 线性代数知识荟萃(4)——矩阵相抵
  8. CentOS随笔 - 4.CentOS7安装MySql 5.5.60(下载 tar 方式安装)
  9. 顶顶顶!! Xcode7.1下用CocoaPods安装Alamofire--swift下的第三方网络库
  10. Linux下 TP(触摸屏)驱动的框架分析
  11. MYSQL选修课的心得体会_选修课心得体会【优秀篇】
  12. iOS 应用唤起淘宝到指定商店页面
  13. win10打开计算机代码,Win10开不了机错误代码0xc0000428三种解决方法
  14. 小程序源码:喝酒神器新UI版本带特效和音效,-多玩法安装简单
  15. 微信小程序外包 很可能遇到很多坑 提供源代码 需要小程序定制的联系 定制开发
  16. 什么是async/await?
  17. 在VUE中使用Lottie动画
  18. No connection could be made because the target machine actively refused it 127.0.0.1:8888
  19. 切图工具:关于工具的几个概念
  20. 在线考试模拟系统都有哪些功能,和优点呢?

热门文章

  1. python编写扎金花小程序
  2. QQ圈子,是在这里在一起,还是在那时在一起?
  3. 东北大学软件学院操作系统v实验报告
  4. npf拒绝访问的问题
  5. 北疆蓝盾 新城区消防大队开展住宅小区消防通道、电动车专项治理行动
  6. K210学习笔记(十)——二维码识别
  7. 清除浮动的常用的几种方法
  8. ❤️‍Spring从入门到大神--事务管理(搞笑漫画讲解!简单易懂!!)
  9. 我的不靠谱择业[饮水思源feeling]
  10. (转)数据挖掘岗求职经验:腾讯+百度+华为(均拿到sp offer)