如何连接不同子目录中的文件?

如何连接不同子目录中的文件?

我有一个大文件夹,其中包含许多子目录,每个子目录包含许多.txt文件。我想将所有这些文件连接到一个.txt文件中。我可以对每个子目录执行此操作cat *.txt>merged.txt,但我尝试对大文件夹中的所有文件执行此操作。我该怎么做呢?

答案1

尝试与

find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile

递归地查找子目录f中的所有“*.txt”文件并将所有文件连接成一个。/path/to/sourcemergedfile

要连接其目录中的每个子目录文件,请执行以下操作:

find . -mindepth 1 -type d -execdir sh -c 'cat $1/*.txt >> $1/mergedfile' _ {} \;

答案2

如果您使用 Bash 并且包含文本文件的数量(即不超过最大参数数量限制,该限制非常大但不是无限),您可以使用以下功能轻松实现此目的globstar

$ shopt -s globstar
$ cat **/*.txt > merged.txt

一种更通用但不太优雅的方法是用作find驱动程序并使其cat在每个文件上调用,并附加输出:

$ find -name \*.txt -exec sh -c 'cat {} >> merged.out' \;

这里需要调用sh,因为您想要附加每个 的结果cat。确保输出文件具有不同的扩展名或位于要合并的树之外,或者find可以尝试将输出与其自身连接。

答案3

如果您必须按特定顺序进行串联,那么下面的代码将按字典顺序(按路径名排序)串联文件bash

shopt -s globstar
for name in **/*.txt; do
    [ -f "$name" ] && cat <"$name"
done >merged.out

这类似于find命令

find  . -type f -name '*.txt' -exec cat {} ';' >merged.out

除了顺序可能不同之外,将包含到常规文件的符号链接(&& [ ! -L "$name" ]如果不需要,请添加 a),并且将排除隐藏文件(以及隐藏目录中的文件)(使用shopt -s dotglob将它们添加回来)。

相关内容