我想将五个文件的内容照原样复制到一个文件中。我尝试使用cp为每个文件执行此操作。但这会覆盖从先前文件复制的内容。我也试过
paste -d "\n" 1.txt 0.txt
它没有用。
我希望我的脚本在每个文本文件的末尾添加换行符。
例如。文件1.txt,2.txt,3.txt。将1,2,3的内容放入0.txt
我该怎么做 ?
我想将五个文件的内容照原样复制到一个文件中。我尝试使用cp为每个文件执行此操作。但这会覆盖从先前文件复制的内容。我也试过
paste -d "\n" 1.txt 0.txt
它没有用。
我希望我的脚本在每个文本文件的末尾添加换行符。
例如。文件1.txt,2.txt,3.txt。将1,2,3的内容放入0.txt
我该怎么做 ?
Answers:
您需要cat
(连接的缩写)命令,并将shell重定向(>
)放入输出文件
cat 1.txt 2.txt 3.txt > 0.txt
>>
到添加一个文件到另一个,其中>
覆盖与任何执导的到它的输出文件。至于换行符,文件中是否有换行符作为第一个字符1.txt
?您可以通过使用找出od -c
第一个字符是否为\n
。
{...}
文件名匹配的形式,所以引号可能会使脚本中的内容有些混乱?我总是尝试ls
在shell中使用类似的东西。正确执行命令后,我将其直接剪切-粘贴到脚本中即可。您可能还会发现该-x
选项在脚本中很有用-在执行之前它将回显脚本中扩展的命令。
对于仍然像我一样迷失于此帖子的那些人,另一种选择是使用find -exec
:
find . -type f -name '*.txt' -exec cat {} + >> output.file
就我而言,我需要一个更健壮的选项,该选项可以查看多个子目录,因此我选择使用find
。分解:
find .
在当前工作目录中查找。
-type f
只对文件感兴趣,对目录等不感兴趣
-name '*.txt'
按名称减少结果集
-exec cat {} +
对每个结果执行cat命令。“ +”表示仅cat
产生1个实例(thx @gniourf_gniourf)
>> output.file
如其他答案所述,将目录内容附加到输出文件的末尾。
*.txt
必须对通配符加引号(否则,整个find
命令,如所写的,是无用的)。另一个缺陷来自严重的误解:执行的命令不是 cat >> 0.txt {}
,而是cat {}
。您的命令实际上等效于{ find . -type f -name *.txt -exec cat '{}' \; ; } >> 0.txt
(我添加了分组,以便您了解实际情况)。另一个缺陷是find
将查找文件0.txt
,并且cat
会说输入文件是输出文件而抱怨。
>> output.file
命令放在最后,这样您就不会引起任何人(包括您自己)思考find
将对cat {} >> output.file
每个找到的文件执行的想法。
find . -type f -exec cat {} + >> outputfile.txt
并且即使目录只有50兆,也无法弄清楚为什么我的输出文件不会停止增长到演出。这是因为我一直将outputfile.txt附加到其自身!因此,只需确保正确命名该文件或将其完全放置在另一个目录中即可避免这种情况。
如果您有某种输出类型,请执行以下操作
cat /path/to/files/*.txt >> finalout.txt
file_1
,,file_2
… file_11
,因为文件排序的自然顺序。
另一种选择是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
(不是wmerge.txt
!)。您可以w"merge.txt"
用来避免与文件名混淆,并-n
用于静默输出。
当然,您也可以使用通配符来缩短文件列表。例如,对于如上例中的带编号文件,可以通过大括号指定范围:
sed -n w"merge.txt" {1..3}.txt
如果原始文件包含不可打印的字符,则在使用cat命令时它们将丢失。使用'cat -v',非可打印字符将被转换为可见的字符串,但是输出文件仍将在原始文件中不包含实际的非可打印字符。如果文件数量少,则替代方法可能是在处理非打印字符的编辑器(例如vim)中打开第一个文件。然后操纵到文件底部,然后输入“:r second_file_name”。这将拉入第二个文件,包括非打印字符。可以对其他文件执行相同的操作。读完所有文件后,输入“:w”。最终结果是,第一个文件现在将包含它最初执行的操作以及已读入文件的内容。