大家好,我是良许。 在使用 Linux 时,你是否遇到过需要将一些命令串在一起,但是其中一个命令不接受管道输入的情况呢?在这种情况下,我们就可以使用 在 Linux 中,所有标准的应用程序都有与之关联的三个数据流。分别是标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr)。这些流通过文本来运行,我们使用文本将输入(stdin)发送到命令,然后响应(stdout)将会以文本形式显示在终端窗口上。错误消息也以文本的形式显示在终端窗口上(stderr)。 Linux 和类 Unix 操作系统的一大功能是可以将一个命令的标准输出流传递到另一个命令的标准输入流。第一个命令不会管它的输出是否写到了终端窗口,第二个命令也不会管它的输入是否来自键盘。 虽然所有 Linux 命令都有三个标准流,但是并不是所有命令都接受另一个命令的标准输出作为它的标准输入流的输入。因此我们无法通过管道将输入传给这些命令。
xargs命令
假如我们使用 $ ls -1 ./*.sh 这一命令列出了当前目录中的 Shell 脚本文件。 如果我们将输出结果通过管道传递给 $ ls -1 ./*.sh | xargs 可以看出来,输出以一长串文本的形式写到了终端上。由此可见, 配合wc命令使用xargs我们可以使用 $ ls *.c | xargs wc 执行结果如下: 命令运行结果显示了每个文件的统计信息以及总数。 这条命令执行了以下操作:
使用带有确认消息的xargs我们可以使用 如果我们通过 $ echo 'one two three' | xargs -p touch 终端上显示将要执行的命令, 我们按下 $ ls one two three 将xargs与多个命令一起使用我们可以用 有点抽象,我们以一个实例来进行讲解。 我们先用 $ tree -d 现在只有一个子目录 images 。 在 directories.txt 这个文件中,我们有一些想要创建的目录的名称。我们先用 $ cat directories.txt 我们把这些内容作为输入数据传给 $ cat directories.txt | xargs -I % sh -c 'echo %; mkdir %' 这条命令执行了以下操作:
命令执行结果: 我们可以用 $ tree -d 将文件复制到多个位置我们可以使用 首先,通过管道将两个目录的名称传给 想要调用 这里还使用了 $ echo ~/dir1/ ~/dir2/ | xargs -n 1 cp -v ./*.c 我们将文件复制到了两个目录,一次复制一个目录。 删除嵌套目录中的文件如果文件名中包含空格或者其他特殊字符(例如换行符), 这里我们以 $ find . -name "*.png" -type f -print0 | xargs -0 rm -v -rf "{}" 这一命令执行了以下操作:
命令执行之后,将搜索了所有子目录,删除了其中匹配的文件。 删除嵌套目录假设我们要删除一组嵌套的子目录,先用 $ tree -d $ find . -name "level_one" -type d -print0 | xargs -0 rm -v -rf "{}" 这条命令使用 find 在当前目录中递归搜索,搜索的目标是名为 level_one 的目录,然后将目录名通过 这个命令和前面的命令之间的区别是,搜索的项目是最顶层目录的名称,而且 每个目录的名称都在删除时打印出来。我们可以用 $ tree -d 所有嵌套的子目录已删除了。 删除一种文件类型以外的所有文件我们可以使用
$ find . -type f -not -name "*.sh" -print0 | xargs -0 -I {} rm -v {} 命令执行之后,我们再通过 $ ls -l 使用Xargs创建压缩文件我们可以使用 我们将在当前目录中搜索 $ find ./ -name "*.sh" -type f -print0 | xargs -0 tar -cvzf script_files.tar.gz 命令执行结果将列出了所有 .sh 文件,并创建了压缩文件。 |
|