xargs命令
时间:2019-04-29 03:17:27 来源:igfitidea点击:
Linux Xargs命令示例
什么是xargs?
Xargs是一个有用的实用程序,可让您从标准输入中构建命令行。这基本上意味着xargs可以从一个命令获取输出,然后针对该输出执行另一个命令。
Xargs命令示例
以下目录包含四个测试文件:
john@ls001a:~/testing> ls -l total 16 -rw-r--r-- 1 john users 145 May 28 09:39 file1.txt -rw-r--r-- 1 john users 145 May 28 09:39 file2 -rw-r--r-- 1 john users 145 May 28 09:39 file3.txt -rw-r--r-- 1 john users 145 May 28 09:40 file4
现在我们将使用命令find . -name "*.txt" | xargs ls -l
只显示与"*.txt"模式匹配的文件。
虽然有更简单的方法来实现这一点,但是这个示例主要是展示xargs命令是如何工作的。
john@ls001a:~/testing> find . -name "*.txt" | xargs ls -l -rw-r--r-- 1 john users 145 May 28 09:39 ./file1.txt -rw-r--r-- 1 john users 145 May 28 09:39 ./file3.txt
从上面的输出中,我们可以看到xargs命令只显示与指定模式匹配的文件。
创建一个包含jpg文件的归档文件
从下面的列表中,我们可以看到有几个图片文件都以.jpg
的文件扩展名结尾。
要归档这些文件,我们可以运行以下xargs命令:find . -name "*.jpg" -type f -print | xargs tar -cvzf my_pictures.tar.gz
john@ls001a:~/testing> ls -l total 36 -rw-r--r-- 1 john users 145 May 28 09:39 file1.txt -rw-r--r-- 1 john users 145 May 28 09:39 file2 -rw-r--r-- 1 john users 145 May 28 09:39 file3.txt -rw-r--r-- 1 john users 145 May 28 09:40 file4 -rw-r--r-- 1 john users 2610 May 28 10:02 picture.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap01.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap02.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap03.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap04.jpg john@ls001a:~/testing> find . -name "*.jpg" -type f -print | xargs tar -cvzf my_pictures.tar.gz ./snap03.jpg ./picture.jpg ./snap04.jpg ./snap01.jpg ./snap02.jpg john@ls001a:~/testing> ls -l total 40 -rw-r--r-- 1 john users 145 May 28 09:39 file1.txt -rw-r--r-- 1 john users 145 May 28 09:39 file2 -rw-r--r-- 1 john users 145 May 28 09:39 file3.txt -rw-r--r-- 1 john users 145 May 28 09:40 file4 -rw-r--r-- 1 john users 369 May 28 10:04 my_pictures.tar.gz -rw-r--r-- 1 john users 2610 May 28 10:02 picture.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap01.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap02.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap03.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap04.jpg
将与模式匹配的文件复制到另一个目录
通常,当运行移动、重命名或删除一个或多个文件的命令时,能够测试我们是否只处理正确的文件通常是有用的。在我们的例子中,我们将用cp
命令代替列表ls
命令:
john@ls001a:~/testing> find . -name "*.txt" | xargs -n1 -i ls -l {} -rw-r--r-- 1 john users 145 May 28 09:39 ./file3.txt -rw-r--r-- 1 john users 145 May 28 09:39 ./file1.txt john@ls001a:~/testing> find . -name "*.txt" | xargs -n1 -i cp {} ./backup/ john@ls001a:~/testing> ls -l ./backup/ total 8 -rw-r--r-- 1 john users 145 May 28 10:09 file1.txt -rw-r--r-- 1 john users 145 May 28 10:09 file3.txt
第一次使用xargs命令显示了我们要复制到另一个位置的文件。然后可以将ls -l
命令更改为复制命令cp
。现在,当我们运行命令时,我们的文件现在已复制到我们的备份目录中。
查找以.txt结尾的文件并添加扩展名_.backup
john@ls001a:~/testing> ls -l total 44 drwxr-xr-x 2 john users 4096 May 28 10:12 backup -rw-r--r-- 1 john users 145 May 28 09:39 file1.txt -rw-r--r-- 1 john users 145 May 28 09:39 file2 -rw-r--r-- 1 john users 145 May 28 09:39 file3.txt -rw-r--r-- 1 john users 145 May 28 09:40 file4 -rw-r--r-- 1 john users 369 May 28 10:04 my_pictures.tar.gz -rw-r--r-- 1 john users 2610 May 28 10:02 picture.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap01.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap02.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap03.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap04.jpg john@ls001a:~/testing> ls *.txt | xargs -i mv {} {}_.backup john@ls001a:~/testing> ls -l total 44 drwxr-xr-x 2 john users 4096 May 28 10:12 backup -rw-r--r-- 1 john users 145 May 28 09:39 file1.txt_.backup -rw-r--r-- 1 john users 145 May 28 09:39 file2 -rw-r--r-- 1 john users 145 May 28 09:39 file3.txt_.backup -rw-r--r-- 1 john users 145 May 28 09:40 file4 -rw-r--r-- 1 john users 369 May 28 10:04 my_pictures.tar.gz -rw-r--r-- 1 john users 2610 May 28 10:02 picture.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap01.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap02.jpg -rw-r--r-- 1 john users 2610 May 28 10:03 snap03.jpg
删除与模式匹配的文件
在下一个xargs命令示例中,我们将查找文件扩展名为.bak
的文件并将其删除。
首先我们通过简单列出找到的所有文件来测试xargs命令。确认可以删除这些文件后,我们可以更改xargs命令以使用rm
命令删除文件:
john@ls001a:~/testing> ls | grep ".bak" | xargs -I{} ls {} file5.bak file6.bak john@ls001a:~/testing> ls | grep ".bak" | xargs -I{} rm {} john@ls001a:~/testing> ls | grep ".bak" | xargs -I{} ls {}
使用-n
选项仅列出信息的子集
我们可以通过指定-n
参数来限制xargs命令处理的信息。
john@ls001a:~/testing> ls backup file3.txt_.backup picture.jpg snap03.jpg file1.txt_.backup file4 snap01.jpg snap04.jpg file2 my_pictures.tar.gz snap02.jpg
john@ls001a:~/testing> ls | xargs -n 3 echo backup file1.txt_.backup file2 file3.txt_.backup file4 my_pictures.tar.gz picture.jpg snap01.jpg snap02.jpg snap03.jpg snap04.jpg
从上面我们可以看到,一次只将3个参数传递给echo语句。