关于xargs和通配符的技巧

时间:2014-09-02 12:32:32

标签: bash xargs

我有两个目录是'dir1'和'dir2',我想输出两个目录的所有内容。所以,我使用bash命令'xargs'只用一个命令行。命令是“echo'1 2'| xargs -d''-I @ -t sh -c'cat dir @ / *'”,但结果很奇怪。

[u@10 /data1/walter]$ echo '1 2' | xargs -d ' ' -I @ -t  sh -c 'cat dir@/*' 
sh -c cat dir1/*   <<<<  This output is normal
1                  <<<<  This is all content in dir1
sh -c cat dir2     
/*                 <<<< these two lines are odd, it looks like xargs insert a '\n' between 'dir2' and '/*'
cat: dir2: Is a directory    <<<< as a result, 'cat' can't receive argument 'dir2'
sh: line 1: /bin: is a directory   <<<< and command line '/*' is error

3 个答案:

答案 0 :(得分:3)

echo会自动在其输出中附加换行符,因此xargs会获得两个值来替换@12\n。立即修复是使用

禁用换行符
echo -n '1 2' | xargs ...

或(更便携)

printf '1 2' | xargs ...

然而,正如其他人所指出的那样,使用xargs可能比它需要的更复杂。

答案 1 :(得分:1)

也许我在你的问题中遗漏了一些内容,但你可以简单地将两个目录都传递给ls

ls dir1/* dir2/*

可以使用brace expansion简化:

ls dir{1,2}/*

答案 2 :(得分:0)

您只需指定两个目录:

ls dir1 dir2

或者

find dir1 dir2

如果你想要一个更复杂的解决方案(即在多个目录中查找)