带有多个命令的 xargs

Posted

技术标签:

【中文标题】带有多个命令的 xargs【英文标题】:xargs with multiple commands 【发布时间】:2013-09-14 21:53:39 【问题描述】:

在当前目录中,我想打印其中的文件名和内容。 我可以通过

单独打印文件名或内容
find . | grep "file_for_print" | xargs echo
find . | grep "file_for_print" | xargs cat

但我想要的是像这样将它们打印在一起:

file1
line1 inside file1
line2 inside file1
file2
line1 inside file2
line2 inside file2

我读过xargs with multiple commands as argument 并尝试了

find . | grep "file_for_print" | xargs -I % sh -c 'echo; cat;'

但不起作用。 我对 xargs 不熟悉,所以不知道“-I % sh -c”到底是什么意思。 谁能帮助我?谢谢!

【问题讨论】:

试试这个.....我认为这应该会有所帮助,“find . | grep "file_for_print" | xargs more " 【参考方案1】:

首先,两者之间几乎没有区别:

find . | grep "file_for_print" | xargs echo

find . -name "file_for_print*"

除了第二个与this_is_not_the_file_for_print 之类的文件名不匹配之外,它将每行打印一个文件名。它也会快很多,因为它不需要生成和打印整个递归目录结构,只是为了让 grep 扔掉大部分。

find . -name "file_for_print*"

其实和

一模一样
find . -name "file_for_print*" -print

-print 操作打印每个匹配的文件名,后跟一个换行符。如果您不向find 提供任何操作,则假定您需要-print。但它有比这更多的技巧。例如:

find . -name "file_for_print*" -exec cat  \;

-exec 操作导致 find 执行以下命令,直到 \;,将 替换为每个匹配的文件名。

find 并不局限于单一操作。你可以告诉它做多少你想做的事。所以:

find . -name "file_for_print*" -print -exec cat  \;

可能会做得很好。

有关这个非常有用的实用程序的更多信息,请键入:

man find

info find

并阅读有关它的所有信息。

【讨论】:

是的 find 和 xargs 非常棒。【参考方案2】:

find . | grep "file_for_print" | xargs -I % sh -c 'echo %; cat %;'(OP 丢失了%s)

【讨论】:

正是我想要的!谢谢! 很高兴能帮上忙 :-) 此解决方案适用于 linux,但不适用于 macos (mojave)。【参考方案3】:

编写自己的 bash 函数怎么样?

#!/bin/bash

myFunction() 
    while read -r file; do
        echo "$file"
        cat "$file"
    done


find . -name "file_for_print*" | myFunction

【讨论】:

【参考方案4】:

因为它还没有被说出来:-I % 告诉 xargs 用你给它的命令中的参数替换 '%'。 sh -c '...' 只是意味着在新的 shell 中运行命令 '...'

所以

xargs -I % sh -c 'echo %; cat %;'

将运行echo [filename],后跟cat [filename],用于为xargs 提供的每个文件名。 echo 和 cat 命令将在不同的 shell 进程中执行,但这通常无关紧要。您的版本不起作用,因为它缺少传递给 xargs 的命令中的 % 标志。


对于它的价值,我会使用这个命令来实现同样的事情:

find -name "*file_for_print*" | parallel 'echo ; cat ;'

因为它更简单(parallel 自动使用 作为替换字符,并且默认可以接受多个命令)。

【讨论】:

【参考方案5】:

在这种特定情况下,每个命令都会针对每个单独的文件执行,因此使用 xargs 没有任何优势。您可以将 -exec 两次附加到您的“查找”:

find . -name "*file_for_print*" -exec echo  \; -exec cat  \;

在这种情况下,-print 可以用来代替第一个 echo,正如 rici 所指出的那样,但是这个示例显示了使用单个 find 执行两个任意命令的能力

【讨论】:

以上是关于带有多个命令的 xargs的主要内容,如果未能解决你的问题,请参考以下文章

xargs 命令教程

xargs命令

xargs命令

xargs命令用法

Linuxlinux下xargs命令

Linux xargs 命令