#1 楼
从技术上讲,这是cat
(“连接”)应该执行的操作,即使大多数人只是将其用于将文件输出到stdout。如果给它多个文件名,它将按顺序输出所有文件名,然后可以将其重定向到新文件中。对于所有文件,只需使用*
(如果您不在目录中,则使用/path/to/directory/*
),然后您的shell会将其扩展为所有文件名#2 楼
如果文件不在同一目录中,则可以在串联之前使用find命令:find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
当已经订购文件并且您要
更便于携带:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
这可能会或可能不会保留文件顺序。
评论
如果您有很多文件,这是一种方法。您可以避免出现“参数列表过长”的错误。
–马修·特纳(Matthew Turner)
2014年5月15日23:17
您需要-name“ * .csv”而不是-name * .csv-如果没有引号,它将失败。
– Peteris
16年8月16日在14:15
引号的需要取决于find命令的版本,特别是在find和awk中,当您使用Mac时,这是一个问题,这两个程序的版本都有些旧。到目前为止,在ubuntu,fedora,debian和CentOS上,它工作顺利,没有引号
– 3nrique0
16 Sep 15'在12:08
我希望当当前目录中没有匹配模式“ * .csv”的文件时,无引号的版本能够正常工作,因为外壳程序随后将传递文字*进行查找。
– RJHunter
16年11月18日在5:47
请参阅为什么遍历find的输出是错误的做法?
–通配符
16年11月18日在6:57
#3 楼
就像这里的其他人说的一样...您可以使用cat
假设您拥有:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
而您只想要
file01
file03
和fileA
到fileC
:cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
或者,使用括号扩展:
cat ~/file0{1..3} ~/file{A..C} > merged-file
或者使用发烧友大括号扩展:
cat ~/file{0{1..3},{A..C}} > merged-file
或者可以使用
for
循环:for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
评论
请注意,字符串[01-03]不能用作通配模式。
– Kusalananda♦
16年8月3日在10:13
#4 楼
实际上,命令$ cat * > merged-file
实际上具有不希望的副作用,即在串联中包含“合并文件”,从而创建失控文件。为了解决这个问题,可以将合并的文件写入另一个目录;
$ cat * > ../merged-file
,或者使用模式匹配将忽略合并的文件;
$ cat *.txt > merged-file
评论
cat *>合并文件工作正常。在创建文件之前先处理globs。如果合并文件已经存在,cat(至少我的猫)将检测到它是输出文件,并拒绝读取它。如果文件已经存在,并且您稍后在管道中进行了重定向,那么显然它无法做到这一点,因此只有这样,您才能获得失控的文件。
–凯文
2012年2月21日在22:48
cat无法检测文件是否为输出文件。重定向发生在外壳中;猫只在标准输出上打印。
–bfontaine
17年9月11日在18:48
#5 楼
您可以指定文件的pattern
,然后按如下所示合并所有文件:cat *pattern* >> mergedfile
#6 楼
sed是另一种选择:sed r 1.txt 2.txt 3.txt > merge.txt
或...
sed h 1.txt 2.txt 3.txt > merge.txt
或...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
或不带重定向...
sed wmerge.txt 1.txt 2.txt 3.txt
请注意,最后一行还写了merge.txt(不合并)。文本文件!)。您可以使用w“ merge.txt”避免与文件名混淆,而-n表示无提示输出。
当然,您也可以使用通配符来缩短文件列表。例如,对于如上述示例中带有编号文件的文件,可以使用大括号指定范围,方法是:
sed -n w"merge.txt" {1..3}.txt
评论
请注意,如果引用的命令编号的方式使外壳按“自然”顺序扩展*,则引用的命令可能只会执行发布者想要的操作。如果您有“ file1.txt ... file9.txt ... file14.txt”,则该文件将不起作用,因为file1?.txt将在file1.txt和file2.txt之间进行排序。您必须将它们重命名为“ file01.txt ... file09.txt ... file14.txt”。如果不确定,请说回声*。
–沃伦·杨(Warren Young)
2010年11月4日在21:43
@Warren:好点(或者您可以使用zsh并设置其numeric_glob_sort选项)。
–吉尔斯'所以-不再是邪恶的'
2010年11月4日23:04
@ warren-young正确,有用的警告评论。但是在我的实际情况下,顺序没有什么区别(因为文件只包含简单的SQL语句,插入没有依赖性的数据记录)。
–伊凡
2010年11月4日23:16
请注意,如果文件数超过一定限制,则可能会在-/ bin / cat:参数列表过长等错误中运行
– Nupur
2015年8月5日13:46
@ ARA1307仅当文件已存在时;否则,将在外壳程序打开文件写入文件之前将glob扩展。不过在那种情况下很好
– Michael Mrozek
18-09-20在3:45