find命令之xargs

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

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

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高; 而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

使用实例:

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

命令:

find . -type f -print | xargsfile

输出:

[root@localhost test]#ll

总计 312

-rw-r--r-- 1 root root 302108 11-03 06:19log2012.log

-rw-r--r-- 1 root root      0 11-12 22:25log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxrwx2 root root   4096 11-12 19:32test3

drwxrwxrwx2 root root   4096 11-12 19:32test4

[root@localhost test]#find . -type f -print | xargs file

./log2014.log: empty

./log2013.log: empty

./log2012.log: ASCII text

[root@localhost test]#

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

命令:

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

输出:

[root@localhost test]#find / -name "core" -print | xargs echo "" >/tmp/core.log

[root@localhost test]#cd /tmp

[root@localhost tmp]#ll

总计 16

-rw-r--r-- 1 root root 1524 11-12 22:29core.log

drwx------ 2 root root 4096 11-12 22:24 ssh-TzcZDx1766

drwx------ 2 root root 4096 11-12 22:28 ssh-ykiRPk1815

drwx------ 2 root root 4096 11-03 07:11 vmware-root

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

命令:

find . -perm -7 -print | xargs chmod o-w

输出:

[root@localhost test]#ll

总计 312

-rw-r--r-- 1 root root 302108 11-03 06:19log2012.log

-rw-r--r-- 1 root root      0 11-12 22:25log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxrwx2 root root   4096 11-12 19:32test3

drwxrwxrwx2 root root   4096 11-12 19:32test4

[root@localhost test]#find . -perm -7 -print | xargs chmod o-w

[root@localhost test]#ll

总计 312

-rw-r--r-- 1 root root 302108 11-03 06:19log2012.log

-rw-r--r-- 1 root root      0 11-12 22:25log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxr-x 2 root root   4096 11-12 19:32test3

drwxrwxr-x 2 root root   4096 11-12 19:32test4

[root@localhost test]#

说明:

执行命令后,文件夹scf、test3和test4的权限都发生改变

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

命令:

find . -type f -print | xargs grep "hostname"

输出:

[root@localhost test]#find . -type f -print | xargs grep "hostname"

./log2013.log:hostnamebaidu=baidu.com

./log2013.log:hostnamesina=sina.com

./log2013.log:hostnames=true[root@localhost test]#

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

命令

find . -name \* -type f -print | xargs grep "hostnames"

输出:

[root@peidatest]#find . -name \* -type f -print | xargs grep "hostnames"

./log2013.log:hostnamesina=sina.com

./log2013.log:hostnames=true[root@localhost test]#

说明:

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

实例6:使用xargs执行mv

命令:

find . -name "*.log" | xargs-imv{}test4

输出:

[root@localhost test]#ll

总计 316

-rw-r--r-- 1 root root 302108 11-03 06:19log2012.log

-rw-r--r-- 1 root root     61 11-12 22:44log2013.log

-rw-r--r-- 1 root root      0 11-12 22:25log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxr-x 2 root root   4096 11-12 22:54test3

drwxrwxr-x 2 root root   4096 11-12 19:32test4

[root@localhost test]#cd test4/

[root@localhost test4]#ll

总计 0[root@localhost test4]#cd ..

[root@localhost test]#find . -name "*.log" | xargs -i mv {} test4

[root@localhost test]#ll

总计 12drwxr-xr-x 6 root root 4096 10-27 01:58scf

drwxrwxr-x 2 root root 4096 11-13 05:50test3

drwxrwxr-x 2 root root 4096 11-13 05:50test4

[root@localhost test]#cd test4/

[root@localhost test4]#ll

总计 304

-rw-r--r-- 1 root root 302108 11-12 22:54log2012.log

-rw-r--r-- 1 root root     61 11-12 22:54log2013.log

-rw-r--r-- 1 root root      0 11-12 22:54log2014.log

[root@localhost test4]#

实例7:find后执行xargs提示xargs: argument line too long解决方法:

命令:

find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

输出:

[root@pdtest4]#find . -type f -atime +0 -print0 | xargs -0 -l1 -t rm -f

rm-f

[root@pdtest4]#

说明:

-l1是一次处理一个;-t是处理之前打印出命令

实例8:使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]

命令:

输出:

[root@localhost test]#ll

总计 12drwxr-xr-x 6 root root 4096 10-27 01:58scf

drwxrwxr-x 2 root root 4096 11-13 05:50test3

drwxrwxr-x 2 root root 4096 11-13 05:50test4

[root@localhost test]#cd test4

[root@localhost test4]#find . -name "file" | xargs -I [] cp [] ..

[root@localhost test4]#ll

总计 304

-rw-r--r-- 1 root root 302108 11-12 22:54log2012.log

-rw-r--r-- 1 root root     61 11-12 22:54log2013.log

-rw-r--r-- 1 root root      0 11-12 22:54log2014.log

[root@localhost test4]#cd ..

[root@localhost test]#ll

总计 316

-rw-r--r-- 1 root root 302108 11-13 06:03log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxr-x 2 root root   4096 11-13 05:50test3

drwxrwxr-x 2 root root   4096 11-13 05:50test4

[root@localhost test]#

说明:

使用-i参数默认的前面输出用{}代替,-I参数可以指定其他代替字符,如例子中的[]

实例9:xargs的-p参数的使用

命令:

find . -name "*.log" | xargs -p -i mv {} ..

输出:

[root@localhost test3]#ll

总计 0

-rw-r--r-- 1 root root 0 11-13 06:06log2015.log

[root@localhost test3]#cd ..

[root@localhost test]#ll

总计 316

-rw-r--r-- 1 root root 302108 11-13 06:03log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03log2014.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxr-x 2 root root   4096 11-13 06:06test3

drwxrwxr-x 2 root root   4096 11-13 05:50test4

[root@localhost test]#cd test3

[root@localhost test3]#find . -name "*.log" | xargs -p -i mv {} ..

mv ./log2015.log .. ?...y

[root@localhost test3]#ll

总计 0[root@localhost test3]#cd ..

[root@localhost test]#ll

总计 316

-rw-r--r-- 1 root root 302108 11-13 06:03log2012.log

-rw-r--r-- 1 root root     61 11-13 06:03log2013.log

-rw-r--r-- 1 root root      0 11-13 06:03log2014.log

-rw-r--r-- 1 root root      0 11-13 06:06log2015.log

drwxr-xr-x 6 root root   4096 10-27 01:58scf

drwxrwxr-x 2 root root   4096 11-13 06:08test3

drwxrwxr-x 2 root root   4096 11-13 05:50test4

[root@localhost test]#

说明:

-p参数会提示让你确认是否执行后面的命令,y执行,n不执行。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容