私はそれぞれ多くのファイルを含む多くのサブディレクトリを持つ大きなフォルダを持っています.txt
。これらすべてのファイルを1つのファイルにリンクしたいと思います.txt
。各サブディレクトリに対してこれを実行できますが、大きなcat *.txt>merged.txt
フォルダ内のすべてのファイルに対して実行しようとしています。どうすればいいですか?
答え1
試してみてください
find /path/to/source -type f -name '*.txt' -exec cat {} + >mergedfile
サブディレクトリ内のすべての「* .txt」ファイルを繰り返し検索し、すべてのf
ファイルを1つにリンクします。/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" ]
必要でない場合は追加)、隠されたファイル(および隠されたディレクトリ内のファイル)は除外されます(shopt -s dotglob
再び追加を使用)。