当前位置: 首页 > Linux

如何在Linux上使用xargs命令

时间:2023-04-06 22:51:00 Linux

大家好,我是梁旭。在使用Linux时,您是否遇到过需要将一些命令串在一起但其中一个不接受管道输入的情况?在这种情况下,我们可以使用xargs命令。xargs可以将一个命令的输出作为参数发送到另一个命令。在Linux中,所有标准应用程序都具有三个与之关联的数据流。它们是标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。这些流对文本进行操作,我们使用文本将输入(stdin)发送到命令,并将响应(stdout)作为文本显示在终端窗口上。错误消息也以文本形式显示在终端窗口(stderr)上。Linux和类Unix操作系统的一个特性是能够将一个命令的标准输出流通过管道传输到另一个命令的标准输入流。第一个命令不关心它的输出是否写入终端窗口,第二个命令不关心它的输入是否来自键盘。虽然所有Linux命令都有三个标准流,但并非所有命令都接受另一个命令的标准输出作为其标准输入流的输入。所以我们不能通过管道输入这些命令。xargs是一个使用标准数据流构建执行管道的命令。通过使用xargs命令,我们可以使echo、rm和mkdir等命令接受标准输入作为它们的参数。xargs命令xargs接受来自管道的输入,也可以接受来自文件的输入。xargs使用该输入作为我们指定命令的参数。如果我们不给xargs一个特定的命令,默认使用echo。xargs总是产生单行输出,即使输入数据是多行的。如果我们使用ls的-1(每行列出一个文件)选项,我们将得到一个文件名列表:$ls-1./*.sh这个命令列出了当前目录中的Shell脚本文件。如果我们将输出通过管道传递给xargs会发生什么?$ls-1./*.sh|xargs如您所见,输出以一长串文本的形式写入终端。因此,xargs可以将输出作为参数传递给其他命令。结合wc命令使用xargs我们可以使用xargs命令轻松让wc命令统计多个文件中的单词、字符和行数$ls*.c|xargswc执行结果如下:统计和总计。此命令执行以下操作:ls列出所有.page文件并将该列表传递给xargs。xargs将所有文件名传递给wc。wc将这些文件名作为命令行参数处理。使用带有确认消息的xargs,我们可以使用-p(交互式)选项让xargs提示我们进行下一步。如果我们通过xargs将一串文件名传递给touch命令,touch将创建这些文件。$echo'一二三'|xargs-ptouch显示要在终端上执行的命令,xargs等待我们键入y或Y、n或N并按Enter响应。如果仅按下Enter,则视为n。只有当我们输入y或Y时,该命令才会执行。我们按y和Enter,然后使用ls检查文件是否已创建。$ls一二三将xargs与多个命令一起使用我们可以将xargs与多个命令一起使用,并带有-I(初始参数)选项。此选项定义替换字符串。只要替换字符串出现在命令行上,我们提供给xargs的值就会被插入。有点抽象,我们举个例子来解释一下。我们先用tree命令查看当前目录下的子目录。-d(目录)选项使tree命令忽略文件,只输出目录。$tree-d现在只有一个子目录images。在directories.txt文件中,我们有一些要创建的目录的名称。让我们先使用cat查看其内容。$catdirectories.txt我们将这些内容作为输入数据传递给xargs并执行以下命令:xargs-I%sh-c'echo%;mkdir%'此命令执行以下操作:catdirectories.txt:将directories.txt文件的内容(要创建的所有目录的名称)传递给xargs。xargs-I%:定义替换字符串%。sh-c:启动一个新的子shell。-c(commond)让shell读取命令。'回声%;mkdir%':每个%都会被xargs传递的目录名替换。echo命令打印目录名称,mkdir命令创建目录。命令执行结果:我们可以使用tree来验证目录是否已经创建。$tree-d将一个文件复制到多个位置我们可以使用xargs命令通过一条命令将一个文件复制到多个位置。首先,将两个目录的名称通过管道传递给xargs。并让xargs一次只将这些参数之一传递给正在使用的命令。要调用cp两次,每次使用两个目录中的一个作为命令行参数,我们可以通过将xargs的-n(最大数量)选项设置为1来实现。这里也使用-v(verboseverbose)选项让cp报告它在做什么。$echo~/dir1/~/dir2/|xargs-n1cp-v./*.c我们将文件复制到两个目录中,一次一个。cp反馈细节,让我们看到做了什么。删除嵌套目录中的文件如果文件名包含空格或其他特殊字符(例如换行符),xargs将无法正确解释文件名。我们可以使用-0(空终止符)选项来解决这个问题。在这种情况下,xargs将使用空字符作为文件名中的最终分隔符。这里我们以find命令为例。find有自己的选项来处理文件名中的空格和特殊字符,即-print0(fullname,nullcharacter)选项。$找到。-name"*.png"-typef-print0|xargs-0rm-v-rf"{}"此命令执行以下操作:查找.搜索名称匹配.png的对象,type-f指定只搜索文件。-print0:名称将以null结尾,并保留空格和特殊字符。xargs-0:xargs还将认为文件名以null结尾,空格和特殊字符不会导致问题。rm-v-rf"{}":rm会反馈正在进行的操作(-v),递归执行操作(-r),删除文件而不发送错误信息(-f)。每个文件名都替换为“{}”。命令执行后,将搜索所有子目录,并删除匹配的文件。删除嵌套目录假设我们要删除一组嵌套的子目录,首先使用树来查看。$树-d$查找。-name"level_one"-typed-print0|xargs-0rm-v-rf"{}"该命令使用find在当前目录递归搜索,搜索目标名为level_one目录,然后通过xargs将目录名传递给rm。该命令与前面的不同之处在于,搜索的项目是最顶层目录的名称,而-typed指定要查找的目录,而不是文件。每个目录的名称在删除时打印出来。我们可以再次使用tree来查看效果:$tree-d所有嵌套的子目录都被删除了。删除除一种文件类型之外的所有文件我们可以使用find、xargs和rm删除所有类型的文件,同时只保留我们想要保留的一种类型。这需要提供您要保留的文件类型。-not选项告诉find返回所有与搜索模式不匹配的文件名。此时,我们再次对xargs使用-I(初始参数)选项。这次定义的替换字符串是{}。这与我们之前使用的替换字符串%具有相同的效果。$找到。-typef-not-name"*.sh"-print0|xargs-0-I{}rm-v{}命令执行后,我们可以通过ls确认结果。可以看到目录下只剩下匹配*.sh的文件了。$ls-l使用xargs创建压缩文件我们可以使用find命令搜索文件,将文件名通过xargs传递给tar命令来创建压缩文件。我们将在当前目录中搜索*.sh文件。$find./-name"*.sh"-typef-print0|xargs-0tar-cvzfscript_files.tar.gz命令执行结果会列出所有.sh文件并创建一个压缩文件。最后,最近有很多朋友找我要一份Linux学习路线图,所以我结合自己的经验,利用业余时间熬夜一个月,整理了一本电子书。无论你是面试还是自我提升,相信都会对你有所帮助!免费送给大家,只求大家给我点个赞!电子书|LinuxDevelopmentLearningRoadmap也希望有小伙伴可以和我一起把这本电子书做得更完美!获得?希望老铁们来个三连击,让更多人看到这篇文章。推荐阅读:干货|程序员和高级架构师免费发送工件的必备资源|支持搜索的资源网站