需要将一些Linux命令串在一起,但其中一个不接受管道输入?xargs可以获取一个命令的输出,并将其作为参数发送到另一个命令。
所有标准Linux实用程序都有三个与之相关联的数据流。它们是标准输入流(stdin)、标准输出流(stdout)和标准错误流(stderr)。
这些流处理文本。我们使用文本向命令发送输入(stdin),响应(stdout)作为文本写入终端窗口。错误消息也作为文本(stderr)写入终端窗口。
Linux和类Unix操作系统的一个重要特性是能够将一个命令的stdout输出通过管道传输到第二个命令的stdin输入。第一个命令不关心它的输出是否没有发送到终端窗口,第二个命令不关心它的输入是否来自键盘。
尽管所有的Linux命令都有三个标准流,但并不是所有的命令都接受另一个命令的stdout作为其stdin的输入。这意味着你不能通过管道输入到它们。
xargs是使用标准数据流构建执行管道的命令。通过使用xargs,我们可以使echo、rm和mkdir等命令接受标准输入作为参数。
xargs将接受管道输入。它还可以接受来自文件的输入。xargs将该输入用作命令的参数,我们已经告诉它要处理这些命令。如果我们不告诉xargs使用特定的命令,它将默认使用echo。
我们可以用它来演示xargs如何总是生成一行输出,即使是从多行输入。
如果将-1(每行列出一个文件)选项与ls一起使用,则会得到一列文件名。
ls -1 ./*.sh这将列出当前目录中的shell脚本文件。
我们得到了一个预期的列。如果我们把它通过沙尔格管,我们能得到什么?
ls -1 ./*.sh | xargs输出作为一个长文本流写入终端窗口。
正是这个功能让xargs将参数输入到其他命令中。
我们可以使用xargs轻松地让wc计算多个文件中的单词、字符和行。
ls *.page | xargs wc事情就是这样:
每个文件的统计信息与总体总数一起显示。
我们可以使用-p(交互式)选项让xargs提示我们确认我们很高兴它继续进行。
如果我们通过xargs传递一个文件名字符串给touch,touch将为我们创建文件。
echo 'one two three' | xargs -p touch将显示要执行的命令,xargs通过键入“y”或“y”、或“n”或“n”并按Enter键等待我们做出响应。
如果您只需按Enter键,它将被视为“n”。仅当键入“y”或“y”时才执行该命令。
我们按“y”键,然后按回车键。我们可以使用ls检查文件是否已创建。
ls one two three通过使用-I(初始参数)选项,我们可以对xargs使用多个命令。
此选项定义一个“替换字符串”。只要替换字符串的标记出现在命令行中,就会**提供给xargs的值。
让我们使用tree命令查看当前目录中的子目录。-d(directory)选项使树忽略文件,只报告目录。
tree -d只有一个子目录叫做“images”
在一个名为“的文件中”目录.txt,我们有一些希望创建的目录的名称。我们可以用cat查看它的内容。
cat directories.txt我们将使用它作为xargs的输入数据。我们的命令是:
cat directories.txt | xargs -I % sh -c 'echo %; mkdir %'这种情况如下:
目录被逐一列出。
我们可以再次使用tree来验证目录是否已创建。
tree -d我们可以使用xargs来允许我们用一个命令将文件复制到多个位置。
我们将把两个目录的名称作为输入参数导入xargs。我们将告诉xargs一次只将这些参数中的一个传递给它正在使用的命令。
在本例中,命令是cp。因此效果是调用cp两次,每次调用两个目录中的一个作为命令行参数。允许这种情况发生的xargs参数是-n(max number)选项。我们要把这个设定成一个。
我们还在cp中使用-v(verbose)选项,以便它报告正在发生的事情。
echo ~/Backups/ ~/Documents/page-files/ | xargs -n 1 cp -v ./*.page文件被复制到两个目录,一次一个目录。cp报告每个文件复制操作,以便我们可以看到它们的发生。
如果文件名中有空格和奇怪的字符(如换行符),xargs将无**确解释它们。我们可以通过使用-0(空终止符)选项来克服这个问题。这告诉xargs使用空字符作为文件名的最终分隔符。
我们将在这个例子中使用find。find有自己的选项来处理文件名中的空白和奇怪字符。它是-print0(全名,空字符)选项。
find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}"这种情况如下:
将搜索所有子目录,并删除与搜索模式匹配的文件。
假设我们要删除一组嵌套的子目录。树会让我们看到它们的。
tree -dfind . -name "level_one" -type d printo | xargs -o rm -v -rf "{}"此命令将使用find在当前目录中递归搜索。搜索目标是一个名为“level\ u one”的目录。目录名通过xargs传递给rm。
此命令与上一个命令之间唯一重要的更改是,搜索项是最顶层目录的名称,-type d告诉find查找目录,而不是文件。
每个目录的名称在删除时打印出来。我们可以用tree检查:
tree -d所有嵌套的子目录都将被删除。
我们可以使用find、xargs和rm删除除要保留的类型之外的所有文件。这有点违反直觉,但我们提供了希望保留的文件类型的名称,而不是要删除的文件类型的名称。
not选项告诉find返回与搜索模式不匹配的文件名。我们再次对xargs使用-I(初始参数)选项。这次我们定义的替换字符串标记是“{}”。这与我们之前生成的replace string令牌的行为完全相同,它恰好是一个“%”。
find . -type f -not - name "*.sh" -print0 | xargs -0 -I {} rm -v {}我们可以和ls核实一下。目录中只剩下与“*.sh”搜索模式匹配的文件。
ls -l我们可以使用find来搜索文件,并将它们通过xargs传递给tar,从而创建一个归档文件。
我们要在当前目录中搜索。搜索模式是“*.page”,所以我们要查找“.page”文件。
find ./ - name "*.page" -type f -print0 | xargs -0 -tar -cvzf page_files.tar.gz在创建存档文件时,将按预期列出这些文件。
有时你需要一个小脚手架当你把东西堆在一起。xargs架起了可以输出信息的命令和不能接收信息的命令之间的桥梁。
xargs和find都有大量的选项。我们鼓励您查看他们的手册页以了解更多信息。
... 在本文中,我将向您展示如何在Linux上安装、运行和使用PowerShell! ...
...许您在Android设备上安装诚实善良的Linux应用程序。下面是如何使用Termux应用程序。 ...
... 如何在windows10上安装linux bash shell ...
要在Linux中重命名文件吗?如果您知道如何在Windows、macOS或Chrome操作系统中完成这项工作,那么您就知道如何在这里完成这项工作。在大多数版本的Linux上,您只需右键单击一个文件并选择Rename选项。 ...
想在Linux系统上添加用户但不知道如何添加?在Linux上使用命令行界面管理用户无疑是一项复杂的工作。而对于初学者来说,即使添加新用户也是一场噩梦。 ...
...在和以前一样具有分裂性。尽管许多主要的Linux发行版都使用它,但铁杆反对者并没有松懈。 linux引导序列 打开计算机电源后,硬件将引导,然后(根据计算机使用的引导扇区类型)执行主引导记录(MBR)或运行统一可扩展固...
...个文件。每一个都有它在远程服务器上的名字。 相关:如何在Linux上使用xargs命令 从ftp服务器下载文件 将curl与文件传输协议(FTP)服务器结合使用很容易,即使您必须使用用户名和密码进行身份验证。要使用curl传递用户名和...
使用Linux管道编排命令行实用程序如何协作。通过利用一组独立命令并将它们转化为一个专注的团队,简化复杂的流程并提高生产率。我们教你怎么做。 到处都是管道 管道是Linux和类Unix操作系统最有用的命令行特性之一。管道...