博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux每日命令(23):find命令之xargs
阅读量:6220 次
发布时间:2019-06-21

本文共 4554 字,大约阅读时间需要 15 分钟。

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

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

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

1. 从当前目录下开始查找的所有文件,然后使用xargs命令来测试它们分别属于哪类文件

命令:

find . -type f -print |xargs file

输出:

[root@localhost test]# lsdir1  log1  log2[root@localhost test]# find . -type f -print |xargs file./log1: empty./log2: ASCII text

2. 从根目录/开始查找名为core的文件或目录,并将查找结果保存到/tmp/core.log 文件中

命令:

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

输出:

[root@localhost tmp]# lsxmlXPathIniteihlTv.c  xmlXPathInitLrmz_p.c  xmlXPathInitpywFgf.c  xmlXPathInitv76QxM.c  yum_save_tx.2018-11-15.18-23.5nqJ3w.yumtx  yum_save_tx.2018-11-16.23-54.cMoa46.yumtx[root@localhost tmp]# find / -name 'core' -print  |xargs   > /tmp/core.log[root@localhost tmp]# lscore.log  xmlXPathIniteihlTv.c  xmlXPathInitLrmz_p.c  xmlXPathInitpywFgf.c  xmlXPathInitv76QxM.c  yum_save_tx.2018-11-15.18-23.5nqJ3w.yumtx  yum_save_tx.2018-11-16.23-54.cMoa46.yumtx[root@localhost tmp]# cat core.log /dev/core /proc/sys/net/core /usr/lib/python2.7/site-packages/firewall/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/infiniband/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/memstick/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/mmc/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/net/ethernet/mellanox/mlx5/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/drivers/usb/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/net/core /usr/lib/modules/3.10.0-693.el7.x86_64/kernel/sound/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/infiniband/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/memstick/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/mmc/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/net/ethernet/mellanox/mlx5/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/drivers/usb/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/net/core /usr/lib/modules/3.10.0-862.14.4.el7.x86_64/kernel/sound/core

说明:

>  是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空;一般我们备份清理日志文件的时候,就是这种方法:先备份日志,再用>,将日志文件清空(文件大小变成0字节);>> 这个是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。

3:从当前目录下开始查找其他用户具有读、写和执行权限的文件,并收回相应的写权限

命令:

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

输出:

[root@localhost test]# lltotal 4drwxr-xr-x. 2 root root 6 Nov 20 18:28 dir1-rwxrwxrwx. 1 root root 0 Nov 20 18:28 log1-rw-r--r--. 1 root root 4 Nov 20 18:29 log2[root@localhost test]# find . -perm -7 -print | xargs chmod o-w[root@localhost test]# lltotal 4drwxr-xr-x. 2 root root 6 Nov 20 18:28 dir1-rwxrwxr-x. 1 root root 0 Nov 20 18:28 log1-rw-r--r--. 1 root root 4 Nov 20 18:29 log2

说明:

可以看到,执行命令前 log1文件,所属用户 所属组 其他用户均有读、写、执行权限,执行命令后,其他用户没有了写权限,其他权限都还在

4. 用grep命令在从当前目录下开始查找类型为文件,且文件内容中含有hostname的文件

命令:

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

输出:

[root@localhost test]# lsdir1  log1  log2[root@localhost test]# cat log1[root@localhost test]# cat log2我是log2hostnamesina=sina.com 哈哈第三行[root@localhost test]# find . -type f -print | xargs grep "hostname"./log2:hostnamesina=sina.com 哈哈

说明:

Linux grep命令用于查找文件里符合条件的字符串。

grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一行显示出来

5. 从当前目录下开始查找名称中以log开头的文件或目录,并将其移动到dir1目录中

命令:

find . -name 'log*' | xargs -i mv {} dir1

输出:

[root@localhost test]# lsdir1   log1  log2[root@localhost test]# find . -name 'log*' | xargs -i mv {} dir1[root@localhost test]# lsdir1[root@localhost test]# cd dir1/[root@localhost dir1]# lslog1  log2

说明:

{} 花括号代表前面find查找出来的文件名。

6. 从当前目录下开始查找名称中以log开头的文件或目录,并将其移动到当前目录的父级目录中,移动时,进行询问

命令:

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

输出:

[root@localhost test]# lsdir1[root@localhost test]# cd dir1/[root@localhost dir1]# lslog1  log2  log3[root@localhost dir1]# find . -name "log*" | xargs -p -i mv {} ..mv ./log1 .. ?...ymv ./log2 .. ?...ymv ./log3 .. ?...n[root@localhost dir1]# lslog3[root@localhost dir1]# cd ..[root@localhost test]# lsdir1  log1  log2

说明:

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

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

命令:

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

输出:

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

说明:

-l1  是指一次处理一个-t   是指处理之前打印出的命令-print 在每一个输出后会添加一个回车换行符,而-print0则不会。

转载地址:http://agoja.baihongyu.com/

你可能感兴趣的文章
Azure ARM (17) 基于角色的访问控制 (Role Based Access Control, RBAC) - 自定义Role
查看>>
Windows Mobile下native c++ typeid的使用
查看>>
用ASP.NET写个SQLSERVER的小工具
查看>>
dojo 官方翻译 dojo/string 版本1.10
查看>>
flex for循环
查看>>
生活中的经典感人语句
查看>>
JavaScript常用字符串函数
查看>>
数据交换格式XML和JSON对比
查看>>
强烈推荐Oracle的入门心得
查看>>
POJ 1195 Mobile phones (二维树状数组或线段树)
查看>>
LINUX下使用crontab进行RMAN备份实验
查看>>
Hive文件格式
查看>>
[LeetCode] Delete Node in a Linked List
查看>>
农历js脚本
查看>>
获取对象的 RTTI 属性与事件的函数
查看>>
java获得CPU使用率,系统内存,虚拟机内存等情况
查看>>
.NET操作Excel表格的整理
查看>>
vcl.Forms等与VCL界面有关的单元不支持跨平台
查看>>
Windows Vista for Developers——第一部分:Aero向导
查看>>
条件随机场CRF HMM,MEMM的区别
查看>>