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
你快到了。在您的最后一个命令中,您可以使用它-I来ls正确执行
-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对其进行操作。
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
除了 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 -c它echo {}。既然你告诉它{}用你从管道中得到的参数来替换,那就是会发生的事情。
即使没有管道,您也可以轻松测试,只需在终端中输入上述命令即可。您接下来写的任何内容都将输出到终端(Ctrl-D 退出)。
在ls -la {}命令中,同样的事情再次发生。将{}替换为 pre-pipe 命令的内容。