2015-01-08 82 views
0

我期待结合输出的Linux查找和头命令(来派生一个文件名列表)与另一个Linux/bash命令的输出并保存结果一个文件使得来自“查找”的每个文件名与另一行中的另一个命令输出一起发生。合并找到命令输出与另一个命令输出并重定向到文件

因此,例如, - 如果目录TESTDIR包含文件A.TXT,b.txt和c.txt, - 和其他命令的输出是一定数目的说如图10所示,所需的输出I”找的是

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 

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

在此先感谢您的帮助!

+1

'$(...)'是“命令替换”,它取代了命令与输出的字符串。 '<(...)'是“Procession Substituion”,并用类似文件的对象替换该命令。所以你会希望在你的粘贴命令中使用<(...)。这表示粘贴需要来自两个来源的多行代码,而您的命令没有这些代码。 –

回答

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 

当然,这是执行每个文件的命令。使用-L1

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

谢谢,这将对我有用! – mailforbiz

0

试试这个,

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

感谢您的指针。这个命令给出错误“sed:no input files”。有一些冲突或某些东西是不能逃脱的权利。 – mailforbiz

+0

似乎它的-i标志不能正常工作 - 如果我将命令的输出保存到文件中,然后在文件上执行sed,它就会起作用。所以需要弄清楚如何让sed -i正常工作。 – mailforbiz

+1

在某些平台上,您必须提供一个备份后缀作为-i参数(即'sed -i.bak ...') –

0

您可以xargs在同一时间在同一行操作:要限制自己,你的问题

find testdir -maxdepth 1 -type f -name "*.text" | xargs -L1 echo "10" > output.txt 
+0

是的,这也适用,并且比看起来似乎更快。谢谢! – mailforbiz

相关问题