別のサブディレクトリにあるファイルをリンクする方法は?

別のサブディレクトリにあるファイルをリンクする方法は?

私はそれぞれ多くのファイルを含む多くのサブディレクトリを持つ大きなフォルダを持っています.txt。これらすべてのファイルを1つのファイルにリンクしたいと思います.txt。各サブディレクトリに対してこれを実行できますが、大きなcat *.txt>merged.txtフォルダ内のすべてのファイルに対して実行しようとしています。どうすればいいですか?

答え1

試してみてください

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

サブディレクトリ内のすべての「* .txt」ファイルを繰り返し検索し、すべてのfファイルを1つにリンクします。/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" ]必要でない場合は追加)、隠されたファイル(および隠されたディレクトリ内のファイル)は除外されます(shopt -s dotglob再び追加を使用)。

関連情報