2015-03-13 82 views
0

我有一个目录parallel/,它包含子目录,其中包含以*.en扩展名结尾的文件。捕获子目录中某些扩展名的文件

这样做会让我看到我需要的文件列表。

find parallel/ -name "*.en" -type f 

现在我需要cat所有这些文件以获得一个组合的文件,即

cat *.en > all.en 

我试过以下,但它没有工作:

$ for i in (find parallel/ -name "*.en" -type f): do cat $i ; done 
-bash: syntax error near unexpected token `(' 

$ for i in ((find parallel/ -name "*.en" -type f)): do cat $i ; done 
-bash: syntax error near unexpected token `(' 

有没有办法让我遍历所有的子目录,并将它们全部“猫”化为单个文件?

回答

1

你非常接近;只是缺乏美元符号。

使bash评估命令并获取输出;使用$()

for i in $(find parallel/ -name "*.en" -type f); do cat $i ; done 

$()相当于,但更好和更安全比老backtics

var=`cmd` #do not use! 
+0

应该怎么办'做猫$ I >> all.en'? – alvas 2015-03-13 08:14:18

+0

是的; >>表示在文件末尾追加。 – 2015-03-13 08:14:52

+1

它提供了'-bash:语法错误附近的意外令牌'done'' – alvas 2015-03-13 08:31:42

1

可以使用-exec选项在find本身调用cat

find parallel/ -name "*.en" -type f -exec cat {} + 

要将其重定向至文件使用:

find parallel/ -name "*.en" -type f -exec cat {} + > all.en 

man find

-exec utility [argument ...] {} + 
     Same as -exec, except that ``{}'' is replaced with as many pathnames as possible 
     for each invocation of utility. This behaviour is similar to that of xargs(1). 
+0

'{} +'是什么意思? – alvas 2015-03-13 08:15:35

+1

''''是'find'命令找到的每个文件的占位符,'+'是命令终止符 – anubhava 2015-03-13 08:16:39

+0

由于分支进程被合并为一个进程(如果可能),因此使用'+'的优势更具效率。 – anubhava 2015-03-13 08:36:50

相关问题