如何加入文字档?


21

我已将许多文档另存为txt。我想将它们一起打印,因此首先我希望将它们一起打印在一个文件中。在这种情况下,顺序无关紧要。

我想要一种不涉及输入要合并文件名称的解决方案,而只需要合并文件夹中所有txt文件的解决方案。

我可以使用命令或某些GUI来做到吗?


我看着这里。不知道该怎么用join

Answers:


43

cat与输出重定向一起使用。语法:cat file [file] [[file] ...] > joined-file

仅包含两个文件的示例(您可以有更多文件):

$ echo "some text in a file" > file1
$ echo "another file with some text" > file2
$ cat file1 file2 > mergedfiles
$ cat mergedfiles
some text in a file
another file with some text

如果您有“许多文档”,请使用Shell Globing(模式):

cat input-files-dir/* > joined-file

这会将该目录中的所有文件连接到当前目录(以防止其与输出文件本身匹配)。它完全独立于使用cat和输出重定向-它只是Bash提供所有文件作为参数cat


文件类型

它将像将纸和胶带那样将文件粘合(连接)在一起。它并不关心实际的文件格式是否能够处理此问题。它适用于文本文件,但不适用于PDF,ODT等。很好,它将它们粘合在一起,但是它不再是有效的PDF / ODT。


加盟顺序

正如phoibos指出的那样,shell globbing将导致文件名的字母顺序。这就是Bash和Shell的工作方式。


关于input file is output file错误的附录

当输入文件的模式与输出文件完全匹配时,将导致错误。这是一项安全功能。示例:cat *.txt > out.txt第二次运行将导致此情况。

您可以做什么:

  • 选择一个更具体的模式以匹配实际的输入文件,而不匹配输出名称。示例:输入文件模式*.txt与输出文件output.out不会冲突。
  • 在不同的目录中工作。在上面的示例中,我使用了一个单独的input-files-dir目录将所有文件放入并输出到当前工作目录。这使得不可能得到此错误。

@cipricus是的,但这是非常基本的shell遍历(模式)。尝试使用您的模式ls以仅列出匹配项。例如ls *.txt,看要匹配什么。
gertvdijk

2
@cipricus猫* .txt> JoinedFile.txt怎么样?
2013年

1
实际上,这是一种更常识的方法,cat首先捕获所有.txt文件,然后将其加入,然后第三次创建一个新的.txt文件,而第一步无法捕获;-)
Sadi

1
@cipricus它只是连接文件。就像用胶水和胶带纸一样!大多数“文档”文件格式(如PDF)都已压缩,但不允许这样做。使用PDF编辑器。但是无论如何,您的问题是关于文本文件的
gertvdijk

1
我完全理解您建议的方法(创建子目录,移动文件然后加入)在某些情况下可能是更好的方法。但是,如果我们只想在当前目录cat * * .txt> JoinedFile.txt中加入所有文本文件(均具有.txt扩展名),则可以完美地完成工作。我只是出于好奇而对其进行了测试,并且它可以工作,而且cipricus似乎也发现了相同的结果。(系统已经开始抱怨我们不应该在这里聊天,否则我会问您是否可以教这个新手如何在没有工具栏的情况下使用这些注释中的格式;-)
Sadi 2013年

12

一种简单的方法是使用cat:

cat file1 file2 > joined_file

如果您只是发布cat file1 file2,则会在标准输出中看到两个文件。通过使用>,您只是将标准输出重定向到文件。这也将与其他命令一起使用。


请阅读问题。您要告诉您指定单个文件名,OP明确不想这样做!
斯里兰卡

2
不是原来的问题。由于出现了更完整的答案,因此我尚未更新我的答案。
豪尔赫·苏亚雷斯·德里斯,2013年

@JorgeSuárezdeLis虽然此答案不能直接帮助OP解决他/她的问题,但请注意,此答案可能会帮助其他只有几个文件要合并的人。(哦,嘿,喜欢我!谢谢!^-^)+1
Souta 2013年

@JorgeSuárezdeLis确实。您已经很好地回答了问题的修订2。几分钟后,版本3更改了有关答案的要求。
gertvdijk

5

用一个简单的循环来做:

for i in *.txt; do cat "$i" >> complete.txt; done

>> 追加到文件。

注意:如果由于某种原因必须再次运行该命令,则必须删除complete.txt,否则将文件写入自身,这是行不通的。


5
这也将正常工作,但是如果您可以使用的参数,我认为不需要for循环cat
gertvdijk

1
是的,您当然是对的。我只是不确定使用的顺序cat *.txt。for循环应排序。
pho13

1
事实证明,*保证按字母顺序排列
pho13

是的,这是完全相同的外壳程序。无论是for在Bash 中还是在其他任何地方使用它,都没有关系。
gertvdijk

4

如果您要合并的所有文件都以结尾.txt,请保持简单:

cat *.txt > combined.txt

如果目录仅包含文本文件,则也很简单:

cat * > combined.txt

(请注意,一旦创建combined.txt,再次执行该操作会将其包含在的扩展中*,从而导致行为异常)。

如果要选择目录中的某些文件而不是其他文件,最好使用文件名来区分所需的文件名。如果没有,您可能会喜欢find。但是我怀疑你需要走那么远。


thnx。如果您看一下已接受答案的评论,Sadi会在评论中准确地建议。如果您的答案是第一个,那么您所需要的就是我所需要的。也来看看我的:在自定义菜单中添加了该内容

感谢您的反馈。是的,我现在看到了,它有点模糊...
Alexis

4

cipricus编写的Thunar自定义动作脚本也启发了我编写类似的Nautilus脚本,我认为这对于其他考虑此问答以供参考的人可能很有用。所以这里是:

#!/bin/sh
#Nautilus Script to join selected text files in a single file and open the joined file with default text editor
#
IFS=$'\n'
FILENAME="JoinedFile_$(date +%Y-%m-%d-%H-%M-%S).txt"
cat "$@" > "$FILENAME"
xdg-open "$FILENAME"

@David Foerster感谢您的编辑。我的旧版本没有任何问题(测试用例有限),改进的版本也没有任何问题。抱歉,由于先前版本的缺陷,给您带来不便。
2015年

它没有缺陷,但是它包含一个不必要的循环,恕我直言,这使代码更难以理解。
David Foerster

2

这是对其他答案的补充和变体,与将这些解决方案应用于Thunar的风俗习惯有关。

并非所有人都可以这种方式使用,但有些人可以。

我认为最有趣的是能够 合并Thunar上下文菜单中的选定文件

这与Sadi在评论gertvdijk答案时所建议的有所不同

   cat %N > JoinedFile

仅所选文件将被加入。将出现条件限制为文本文件。

在此处输入图片说明

在此处输入图片说明


特别感谢Sadi的评论,它为我提供了最清晰,最新的解决方案。

我接受gertvdijk回答是肯定的。这不仅是Sadi发表评论的机会,而且似乎对其他人来说具有更大的价值,它提供了一个经过充分论证和完整的解决方案(尽管略高于我的CLI阅读技能)。


2

您也可以尝试使用find命令,

find . -name "*.txt" -type f -exec cat {} + > file

.txt在当前目录中查找 文件,cat并对每个已建立的文件执行命令。最后,整个输出重定向到文件名file(直接在当前文件名中创建)。

说明:

.                  # current directory

-name              # helps to find only .txt files.

-type f            # Only files

-exec cat {} +     # helps to run cat command on the founded .txt files.

>                  # Output redirection operator

file               # to store final output.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.