如何在Linux上使用xargs命令(非常详细)零基础入门到精通,收藏这一篇就够了(1)


![](https://img-blog.csdnimg.cn/img_convert/2b9e9486c9612dd4517debc4c9af7595.jpeg)


终端上显示将要执行的命令,`xargs` 等待我们输入 `y` 或 `Y` ,`n` 或 `N` 并按 Enter 来响应。如果只按了 `Enter` ,则视为 `n`。只有当我们当输入 `y` 或 `Y` 时才执行该命令。


我们按下`y`和 Enter ,然后使用`ls`用来检查文件是否已经创建。



$ ls one two three


![](https://img-blog.csdnimg.cn/img_convert/aed6296db79daf918473dd1fbef22128.jpeg)


##### 将xargs与多个命令一起使用


我们可以用`-I`(初始参数)选项来将 `xargs` 和多个命令一起使用。这一选项定义了`替换字符串`。在命令行中的任何出现替换字符串的位置,都会插入我们提供给 `xargs` 的值 。


有点抽象,我们以一个实例来进行讲解。


我们先用 `tree` 命令查看当前目录中的子目录。该 `-d`(directory)选项使 `tree` 命令忽略文件,只输出目录。



$ tree -d


![](https://img-blog.csdnimg.cn/img_convert/64f8a5079c0d9a6a476da890aa40723b.jpeg)


现在只有一个子目录 images 。


在 directories.txt 这个文件中,我们有一些想要创建的目录的名称。我们先用 `cat` 查看其中的内容。



$ cat directories.txt


![](https://img-blog.csdnimg.cn/img_convert/0ce7a7a1ffd999506ae3aef95c0012d9.jpeg)


我们把这些内容作为输入数据传给 `xargs` ,执行以下的命令:



$ cat directories.txt | xargs -I % sh -c ‘echo %; mkdir %’


这条命令执行了以下操作:


* **cat directories.txt** :将 directrories.txt 文件的内容(所有要创建的目录名称)传给 `xargs`。
* **xargs -I %** :定义了替换字符串 `%`。
* **sh -c**:启动一个新的子shell。`-c`(commond)让 shell 读取命令。
* **‘echo %; mkdir %’**:每个`%`都会被替换为 `xargs` 传过来的目录名称 。`echo`命令打印目录名称,`mkdir` 命令创建目录。


命令执行结果:


![](https://img-blog.csdnimg.cn/img_convert/2e9928205119dd9728bf09ef1495d067.jpeg)


我们可以用 `tree` 验证已创建是否已创建了目录。



$ tree -d


![](https://img-blog.csdnimg.cn/img_convert/fa661cf4ebe7a27d843e3aa23b5b43d5.jpeg)


##### 将文件复制到多个位置


我们可以使用 `xargs` 命令来用一个命令将文件复制到多个位置。


首先,通过管道将两个目录的名称传给 `xargs` 。并且让 `xargs` 一次只将其中一个参数传递给正在使用的命令。


想要调用 `cp` 两次,每次各使用两个目录中的一个作为命令行参数,我们可以通过将 `xargs` 的 `-n`(max number)选项设置为 1 来实现。


这里还使用了`-v`(verbose 详细信息)选项,让 `cp` 反馈正在执行的操作。



$ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c


我们将文件复制到了两个目录,一次复制一个目录。`cp` 反馈了详细信息,让我们看到进行了哪些操作。


![](https://img-blog.csdnimg.cn/img_convert/8a4db5cf74f824e7e0af5d1b8c59ca3c.jpeg)


##### 删除嵌套目录中的文件


如果文件名中包含空格或者其他特殊字符(例如换行符),`xargs` 将无法正确解释这些文件名。我们可以使用 `-0`(空终止符)选项来解决这一问题。此时, `xargs` 将使用 `null` 字符作为文件名最终的分隔符。


这里我们以 `find` 命令为例。`find` 有自己的选项来处理文件名中的空格和特殊字符,即 `-print0`(全名,空字符)选项。



$ find . -name “*.png” -type f -print0 | xargs -0 rm -v -rf “{}”


这一命令执行了以下操作:


* **find . -name “\*.png”** :`find` 将从当前目录中搜索名称和 \*.png 相匹配的对象,`type -f` 指定了只搜索文件。
* **-print0**:名称将以空字符结尾,并且保留空格和特殊字符。
* **xargs -0**:`xargs` 也将考虑文件名以空值结尾,并且空格和特殊字符不会引起问题。
* **rm -v -rf “{}”**:`rm` 将反馈正在进行的操作(`-v`),递归进行操作(-r),不发送错误提示而直接删除文件(`-f`)。每个文件名替换 “{}”。


命令执行之后,将搜索了所有子目录,删除了其中匹配的文件。


![](https://img-blog.csdnimg.cn/img_convert/8c81d504e44ba0f09ffd7aecd7e4b55b.jpeg)


##### 删除嵌套目录


假设我们要删除一组嵌套的子目录,先用`tree`进行查看。



$ tree -d


![](https://img-blog.csdnimg.cn/img_convert/965ad63d40104490cff0c07df5ea7a96.jpeg)



$ find . -name “level_one” -type d -print0 | xargs -0 rm -v -rf “{}”


这条命令使用 find 在当前目录中递归搜索,搜索的目标是名为 level\_one 的目录,然后将目录名通过`xargs`传递给 `rm` 。


这个命令和前面的命令之间的区别是,搜索的项目是最顶层目录的名称,而且`-type d`说明要查找的目录,而不是文件。


![](https://img-blog.csdnimg.cn/img_convert/277d65e8529e543d092f4fa4dafc2865.jpeg)


每个目录的名称都在删除时打印出来。我们可以用`tree`再查看效果:



$ tree -d


![](https://img-blog.csdnimg.cn/img_convert/32d02c3bc64f1dbebb0e6633e0410852.jpeg)


所有嵌套的子目录已删除了。


##### 删除一种文件类型以外的所有文件


我们可以使用 `find` ,`xargs` 和 `rm` 删除所有类型的文件而只保留一种我们想要保留的类型的文件。这需要提供想要保留的文件类型。


`-not` 选项让 `find` 返回所有与搜索模式不匹配的文件名。我们此时再次使用 `xargs` 的 `-I` (初始参数)选项。这次定义的替换字符串为 `{}` 。这和我们之前使用的替换字符串 `%` 的效果是相同的。



$ find . -type f -not -name “*.sh” -print0 | xargs -0 -I {} rm -v {}


![](https://img-blog.csdnimg.cn/img_convert/7f7371111885fa3f162ea91068dff5aa.jpeg)


命令执行之后,我们再通过 `ls` 来确认结果。可以看到,目录中只剩下了与 `*.sh` 相匹配的文件。



$ ls -l


![](https://img-blog.csdnimg.cn/img_convert/62d192495313af40392f7d391d7d7c98.jpeg)


### 最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

### 资料预览

给大家整理的视频资料:

![](https://img-blog.csdnimg.cn/img_convert/e58adecee0440e86a03e7eb923141ed4.png)

给大家整理的电子书资料:

  

![](https://img-blog.csdnimg.cn/img_convert/452857bc65318a995caeb2b8ac639b7f.png)



**如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
的动力!**

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化的资料的朋友,可以点击这里获取!](https://bbs.csdn.net/topics/618542503)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值