当前位置: 首页>>技术教程>>正文


filemanager – 如何加入文本文件?

问题描述

我已经将许多文档保存为 txt。我想把它们打印在一起,所以首先我想把它们放在一个文件中。在这种情况下,顺序无关紧要。

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

我可以用命令或一些 GUI 来做吗?


我看着 here 。不知道如何使用 join

最佳方法

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

如果您有 “many documents”,请使用 shell globbing(模式):

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

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


文件类型

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


加入顺序

作为 phoibos pointed out,shell 通配符将导致文件名的字母顺序。这就是 Bash 和 shell globbing 的工作原理。


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

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

你能做些什么:

  • 选择更具体的模式来匹配实际输入文件,而不是匹配输出名称。示例:输入文件模式 *.txt 与输出文件 output.out 不会发生冲突。

  • 在不同的目录中工作。在上面的例子中,我使用了一个单独的 input-files-dir 目录来放置所有文件,并输出到当前工作目录。这使得不可能得到这个错误。

次佳方法

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

cat file1 file2 > joined_file

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

第三种方法

用一个简单的循环来做:

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

>> 附加到文件中。

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

第四种方法

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

cat *.txt > combined.txt

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

cat * > combined.txt

(请注意,一旦您创建 combined.txt ,再次创建它会将其包含在 * 的扩展中,从而导致奇怪的行为)。

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

第五种方法

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"

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/11927.html,未经允许,请勿转载。