管道 xargs 后的管道命令

ano*_*on1 58 shell pipe find xargs

HP-UX ***** B.11.23 U ia64 **** 无限制用户许可证

find . -type d -name *log*?|?xargs ls -la
Run Code Online (Sandbox Code Playgroud)

给我目录名称(包含log在目录名称中的名称),后跟该目录中的所有文件。

目录?/var/opt/SID/application_a/log/,?/var/opt/SID/application_b/log/,?/var/opt/SID/application_c/log/等等包含日志文件。

我只希望ls命令列出两个最新的日志文件,我通常使用ls -latr?|?tail -2.

输出必须是这样的..

find . -type d -name *log*?|?xargs ls -la
Run Code Online (Sandbox Code Playgroud)

find . -type d -name *log*?|?xargs ls -la?|?tail -2没有给我上面的结果。我得到的是最后两个find . -type d -name *log*?|?xargs ls -la命令文件的列表 。

那么我可以在管道之后管道命令xargs吗?我如何查询,以获取上述格式的结果文件列表?

/var/opt/SID/application_a/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_b/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
/var/opt/SID/application_c/log/
-rw-rw-rw-   1 user1    user1      59698 Jun 11  2013 log1
-rw-rw-rw-   1 user1    user1      59698 Jun 10  2013 log2
Run Code Online (Sandbox Code Playgroud)

给了我当前目录中的十个目录名称的列表,这恰好是/var/opt/SID,这也不是我想要的。

fre*_*ini 94

你快到了。在您的最后一个命令中,您可以使用它-Ils正确执行

-I replace-str

    用从标准输入读取的名称替换初始参数中出现的replace-str。此外,未加引号的空格不会终止输入项;相反,分隔符是换行符。暗示-x-L 1

所以,与

find . -type d -name "*log*" | xargs -I {} sh -c "echo {}; ls -la {} | tail -2"
Run Code Online (Sandbox Code Playgroud)

您将echo找到由 找到的目录find,然后ls | tail对其进行操作。

  • 我用`xargs -n 1 sh -c 'echo $0'` (4认同)
  • 要使其与带空格的文件名一起使用,请使用 `-print0`、`xargs -0` 并将 `{}` 转义为双引号 _inside_ `sh` 命令:`find 。-type d -name "*log*" -print0 | xargs -0 -I {} sh -c "echo \"{}\";ls -la \"{}\" | tail -2"` (3认同)

Ole*_*nge 6

GNU Parallel 使此类任务变得简单:

find . -type d -name "*log*" | parallel --tag "ls -la {} | tail -2"
Run Code Online (Sandbox Code Playgroud)

如果您不想完全安装 GNU Parallel,您可以进行最小安装:http : //git.savannah.gnu.org/cgit/parallel.git/tree/README


Bor*_*isu 6

除了 fredtantini 和一般说明(因为文档有点混乱):

xargs -I {}会从标准输入“{}”字符和,无坚不摧从管替换它们。这意味着您实际上可以{}用任何字符组合替换(也许是为了更好地适应您喜欢的编程风格)。例如xargs -I % sh -c "echo %"。如果你总是使用 thexargs -I {}你可以用它代替它,xargs -i因为它是速记。编辑:该xargs -i选项已被弃用,因此请坚持使用xargs -I{}.

sh -c会告诉你的bash / shell从一个字符串,而不是从标准输入读取下一个命令。所以写作sh -c "echo something"等价于echo something.

xargs -I {} sh -c "echo {}"将读取你创建的输入与sh -cecho {}。既然你告诉它{}用你从管道中得到的参数来替换,那就是会发生的事情。

即使没有管道,您也可以轻松测试,只需在终端中输入上述命令即可。您接下来写的任何内容都将输出到终端(Ctrl-D 退出)。

ls -la {}命令中,同样的事情再次发生。将{}替换为 pre-pipe 命令的内容。

  • 看来“-i”已经被弃用了...... (2认同)