![如何合并文本文件?](https://linux22.com/image/830859/%E5%A6%82%E4%BD%95%E5%90%88%E5%B9%B6%E6%96%87%E6%9C%AC%E6%96%87%E4%BB%B6%EF%BC%9F.png)
我已经将许多文档保存为 txt 格式。我想将它们一起打印,因此首先将它们放在一个文件中。在这种情况下,顺序无关紧要。
我想要一个不需要输入要合并的文件的名称的解决方案,而只是合并文件夹内的所有 txt 文件。
我可以用命令或者一些 GUI 来完成它吗?
我看了这里。不知道如何使用join
。
答案1
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 通配符(模式):
cat input-files-dir/* > joined-file
这会将该目录中的所有文件合并到当前目录(防止它与输出文件本身匹配)。它完全独立于输出重定向的使用cat
- 它只是 Bash 将所有文件作为参数提供给cat
。
文件类型
它只会将文件粘合在一起,就像您用纸和胶带粘合一样。它并不关心实际的文件格式是否能够处理这种情况。它可以用于文本文件,但不适用于 PDF、ODT 等。好吧,它会将它们粘合在一起,但它不再是有效的 PDF/ODT。
加入顺序
作为福伊波斯指出shell 通配符将导致文件名按字母顺序排列。这就是 Bash 和 shell 通配符的工作方式。
关于input file is output file
错误的附录
当输入文件的模式与输出文件完全相同时,这将导致错误。这是一项安全功能。例如:cat *.txt > out.txt
第二次运行将导致这种情况。
你可以做什么:
- 选择更具体的模式来匹配实际的输入文件,而不是匹配输出名称。例如:输入文件模式
*.txt
与输出文件output.out
不会发生冲突。 - 在不同的目录中工作。在上面的例子中,我使用了一个单独的
input-files-dir
目录来放置所有文件,并输出到当前工作目录。这使得不可能出现此错误。
答案2
一个简单的方法是使用 cat:
cat file1 file2 > joined_file
如果您只是发出,cat file1 file2
您将在标准输出上看到两个文件。通过使用>
,您只是将标准输出重定向到一个文件。这也适用于其他命令。
答案3
用一个简单的循环来完成:
for i in *.txt; do cat "$i" >> complete.txt; done
>>
附加到文件。
注意:如果由于某种原因您必须再次运行该命令,则必须删除complete.txt
,否则您会将文件写入其自身,这是行不通的。
答案4
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"