我有一个大文件夹,其中包含许多子目录,每个子目录包含许多.txt
文件。我想将所有这些文件连接到一个.txt
文件中。我可以对每个子目录执行此操作cat *.txt>merged.txt
,但我尝试对大文件夹中的所有文件执行此操作。我该怎么做呢?
答案1
尝试与
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
递归地查找子目录f
中的所有“*.txt”文件并将所有文件连接成一个。/path/to/source
mergedfile
要连接其目录中的每个子目录文件,请执行以下操作:
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
将它们添加回来)。