技术改变生活

博客园 首页 新随笔 联系 订阅 管理

xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find . -type f -name "*.log" | xargs rm -rf * 就将以log结尾的文件删除了,如果我想去移动或者复制就需要使用参数来代替了。

xargs -i 参数或者-I参数配合{}即可进行文件的操作。

[root@centos17 linshi]# find . -type f -name "*.log" | xargs -i cp {} /tmp/k/

[root@centos17 linshi]# find . -type f -name "*.log" | xargs -I {} cp {} /tmp/n/

结果出来了,
  加-i 参数直接用 {}就能代替管道之前的标准输出的内容;
  加 -I 参数 需要事先指定替换字符。



其他案例:
echo --help | xargs cat  
#将echo输出的信息作为cat命令的参数使用,xargs传递参数,将前一个命令的标准输出作为后一个命令的参数使用
ls *.txt | xargs -i mv {} /mnt
#查看当前目录下所有txt文件,xargs的-i参数是将前面的标准输出作为参数传递给{}
echo "ni|shi|shui" | xargs -d"|" -n2
#xargs的-d参数指定分隔符,-n表示每行显示的列数

[root@b test]# find . -name "*.txt" -exec tar -cf a.tar {} \;
[root@b test]# tar -tf a.tar
./m.txt

find命令的-exec参数将前面find查找到的内容交给后面的tar命令打包,由于find每次查找一个就执行一次exec,所以tar最后打包的文件全部覆盖只剩下最后一个文件。

[root@b test]# find . -name "*.txt" | xargs -i tar cf b.tar {}
[root@b test]# tar -tf b.tar
./m.txt

[root@b test]# find . -name "*.txt" -print | xargs -i tar cf b.tar {}
[root@b test]# tar -tf b.tar
./m.txt

#写法相同,xargs的-I参数表示将前面find的信息传递到后面{}进行打包,每查找到一个文件就进行打包一次,所以会重复覆盖。

[root@b test]# find . -name "*.txt" -print0 | xargs -0 tar cf b.tar
[root@b test]# tar -tf b.tar
./a.txt
./b.txt
./m.txt

#print0表示将find查找的内容在同一行输出,xargs的-0参数指定以null为分隔符来进行打包。

 

 

 

xargs使用
 
删除海量文件
[root@x112 test]# ls | xargs -n 50 -i rm -rf {}
将ls输出的内容,每50个一组,传递给rm后面的{},作为其参数进行执行。可以删除目录下超多文件。
 
 
 
查看find过滤的指定文件
[root@x112 ~]# find linshi/ -mtime -3 | sed '1d' | xargs ls -lh
-rw-r--r-- 1 root root 148 Oct 24 18:24 linshi/10_for1.sh
-rw-r--r-- 1 root root 147 Oct 24 17:52 linshi/10_for.sh
-rw-r--r-- 1 root root  43 Oct 24 23:47 linshi/c.txt
-rw-r--r-- 1 root root  32 Oct 24 20:06 linshi/d.txt
 
linshi/test:
total 0
[root@x112 ~]# find linshi/ -mtime -3 | xargs ls -lh
-rw-r--r-- 1 root root 148 Oct 24 18:24 linshi/10_for1.sh
-rw-r--r-- 1 root root 147 Oct 24 17:52 linshi/10_for.sh
-rw-r--r-- 1 root root  43 Oct 24 23:47 linshi/c.txt
-rw-r--r-- 1 root root  32 Oct 24 20:06 linshi/d.txt
 
linshi/:
total 36K
-rw-r--r-- 1 root root  148 Oct 24 18:24 10_for1.sh
-rw-r--r-- 1 root root  147 Oct 24 17:52 10_for.sh
-rw-r--r-- 1 root root  160 Oct 17 16:14 a.txt
-rw-r--r-- 1 root root   43 Oct 24 23:47 c.txt
-rw-r--r-- 1 root root   32 Oct 24 20:06 d.txt
-rw-r--r-- 1 ftp  root  501 Aug 13 09:35 fstab.bak
-rw-r--r-- 1 root root   99 Aug 19 20:36 host_for.sh
-rw-r--r-- 1 ftp  root 1.1K Aug 17 12:47 ks.cfg
-rw-r--r-- 1 root root   63 Aug 19 20:46 scp_copy.sh
drwxr-xr-x 6 ftp  root  269 Sep  7 20:57 software
drwxr-xr-x 2 root root    6 Oct 27 00:06 test
 
linshi/test:
total 0
[root@x112 ~]# find linshi/ -mtime -3
linshi/
linshi/10_for.sh
linshi/10_for1.sh
linshi/d.txt
linshi/c.txt
linshi/test

总结:由上面案例可知,find命令查找的文件,默认包含查找文件夹范围本身,需要剔除文件夹范围本身,查询结果才为真。

 

posted on 2019-05-01 22:01  小阿峰  阅读(3805)  评论(0编辑  收藏  举报