我可以这样做:如何使用Unix将子目录中的文件连接到单个文件中查找execute和cat?
$ find .
.
./b
./b/foo
./c
./c/foo
这:
$ find . -type f -exec cat {} \;
This is in b.
This is in c.
但不是这样的:
$ find . -type f -exec cat > out.txt {} \;
为什么不呢?
我可以这样做:如何使用Unix将子目录中的文件连接到单个文件中查找execute和cat?
$ find .
.
./b
./b/foo
./c
./c/foo
这:
$ find . -type f -exec cat {} \;
This is in b.
This is in c.
但不是这样的:
$ find . -type f -exec cat > out.txt {} \;
为什么不呢?
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
我在达尔文,所以这可能是一个应该发布的警告,但有一些这些方法,我得到一个循环行为,其中的文件内容是连续的狡猾追加无限。 – 2008-10-03 20:02:48
是的,这是因为out.txt与在同一个目录中。 ;把它放在外面的某个地方。 – dlamblin 2008-10-03 20:15:30
是的。这就是诀窍。输出文件不能在你找到的相同目录中。 – 2008-10-03 20:41:24
如何只找到重定向到一个文件的输出,因为所有你想要做的是猫的所有文件合并成一个大文件:
find . -type f -exec cat {} \; > /tmp/out.txt
你可以做这样的事情:
$ cat `find . -type f` > out.txt
这个在Darwin上为我工作。 – 2008-10-03 20:05:16
或者只是离开了找到,如果你使用真正伟大的Z shell(zsh
),这是没用的,你可以这样做:
setopt extendedglob
(这应该是在你的.zshrc
) 然后:
cat **/*(.) > outfile
只是工作:-)
嗯......发现似乎递归你输出out.txt到当前目录
尝试类似于
find . -type f -exec cat {} \; > ../out.txt
也许你从其他响应中推断出,在查找获取它作为参数之前,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。
试试这个:
(find . -type f -exec cat {} \;) > out.txt
在bash,你可以做
cat $(find . -type f) > out.txt
与$(),你可以得到一个命令的输出,并把它传递给另一个
你拼错“串联“在那里的标题.. – Kip 2008-10-03 20:29:38