将find命令输出与另一个命令输出合并并重定向到文件

时间:2015-01-08 17:11:11

标签: linux bash merge find

我希望将Linux find和head命令的输出(以获取文件名列表)与另一个Linux / bash命令的输出结合起来,并将结果保存到一个文件中,以便来自"找到"与另一个命令输出在另一行上发生。

所以,例如, - 如果目录 testdir 包含文件a.txt,b.txt和c.txt, - 另一个命令的输出是一些数字,比如10,我想要的输出是

10 a.txt
10 b.txt
10 c.txt 

在这里搜索时,我看到人们建议粘贴进行类似的合并但我无法弄清楚如何在这种情况下执行它,因为粘贴似乎是期待文件。我试过了

paste  $(find testdir -maxdepth 1 -type f -name "*.text" | head -2) $(echo "10") >  output.txt
paste: 10: No such file or directory

对于我做错了什么,我会感激不尽。任何其他实现同样事物的方式也是受欢迎的。

请注意,如果我想让所有内容都显示在同一行上,我可以使用xargs来完成这项工作。

$find testdir -maxdepth 1 -type f -name "*.text" | head -2 |xargs echo "10" >  output.txt

$cat output.txt
10 a.txt b.txt

但我的要求是合并两个命令输出,如前所示。

提前感谢您的帮助!

3 个答案:

答案 0 :(得分:0)

试试这个,

$find testdir -maxdepth 1 -type f -name "*.text" | head -2 |tr ' ' '\n'|sed -i 's/^/10/' >  output.txt

答案 1 :(得分:0)

find可以同时处理-exec-print指令,只需要合并输出:

$ find . -maxdepth 1 -type f -name \*.txt -exec echo hello \; -print | paste - -
hello   ./b.txt
hello   ./a.txt
hello   ./all.txt

假设你的"命令"需要文件名(这里是一个非常人为的例子):

$ find . -maxdepth 1 -type f -name \*.txt -exec sh -c 'wc -l <"$1"' _ {} \; -print | paste - -
4   ./b.txt
4   ./a.txt
7   ./all.txt

当然,它正在为每个文件执行命令。限制自己的问题:

cmd_out=$(echo 10)
for file in *.txt; do
    echo "$cmd_out $file"
done

答案 2 :(得分:0)

您可以使用xargs

一次让-L1一行操作
find testdir -maxdepth 1 -type f -name "*.text" | xargs -L1 echo "10" >  output.txt