2008-10-03 31 views

回答

27

find的-exec参数运行您为每个找到的文件指定一次的命令。尝试:

$ find . -type f -exec cat {} \; > out.txt 

或:

$ find . -type f | xargs cat > out.txt 

xargs的标准输入转换成命令行参数指定的命令。如果你担心在文件名中嵌入空格,请尝试:

$ find . -type f -print0 | xargs -0 cat > out.txt 
+1

我在达尔文,所以这可能是一个应该发布的警告,但有一些这些方法,我得到一个循环行为,其中的文件内容是连续的狡猾追加无限。 – 2008-10-03 20:02:48

+0

是的,这是因为out.txt与在同一个目录中。 ;把它放在外面的某个地方。 – dlamblin 2008-10-03 20:15:30

+0

是的。这就是诀窍。输出文件不能在你找到的相同目录中。 – 2008-10-03 20:41:24

1

如何只找到重定向到一个文件的输出,因为所有你想要做的是猫的所有文件合并成一个大文件:

find . -type f -exec cat {} \; > /tmp/out.txt 
2

你可以做这样的事情:

$ cat `find . -type f` > out.txt 
+0

这个在Darwin上为我工作。 – 2008-10-03 20:05:16

0

或者只是离开了找到,如果你使用真正伟大的Z shell(zsh),这是没用的,你可以这样做:

setopt extendedglob 

(这应该是在你的.zshrc) 然后:

cat **/*(.) > outfile 

只是工作:-)

4

嗯......发现似乎递归你输出out.txt到当前目录

尝试类似于

find . -type f -exec cat {} \; > ../out.txt 
1

也许你从其他响应中推断出,在查找获取它作为参数之前,shell解释了>符号。但是,为了回答你的“为什么不”让我们看看你的命令,那就是:

$ find . -type f -exec cat > out.txt {} \; 

所以你给find这些参数:"." "-type" "f" "-exec" "cat"你给重定向这些参数:"out.txt" "{}"";"。由于没有使用分号终止-exec参数,并且没有使用文件名作为参数(“{}”),所以这会混淆find,它可能会混淆重定向。

看看其他建议,你应该避免在你找到的同一目录中创建输出。但是他们会考虑到这一点。而-print0 | xargs -0组合非常有用。你想输入可能是更喜欢:

$ find . -type f -exec cat \{} \; > /tmp/out.txt 

现在,如果你真的只有子目录,只有普通文件的一个级别,你可以做一些愚蠢和简单的像这样:

cat `ls -p|sed 's/\/$/\/*/'` > /tmp/out.txt 

其中ls列出所有文件和目录,将'/'添加到目录中,而sed将在目录中附加'*'。然后shell将解释这个列表并扩展这个列表。假设这不会导致shell处理太多的文件,这些文件将作为参数传递给cat,并且输出将被写入out.txt。

0

试试这个:

(find . -type f -exec cat {} \;) > out.txt 
0

在bash,你可以做

cat $(find . -type f) > out.txt 

与$(),你可以得到一个命令的输出,并把它传递给另一个

相关问题