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语句。