すべてのサブディレクトリで同じ名前のtxtファイルをマージする方法

すべてのサブディレクトリで同じ名前のtxtファイルをマージする方法

多くのファイルを含むフォルダがあり、各フォルダには同じ名前のtxtファイルがあり、すべてのサブディレクトリ内のすべてのtxtファイルを1つのフォルダにマージしたいと思います。

例:

/home/parent/Folder1 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder2 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt
/home/parent/Folder3 ===> txtfile1.txt, txtfile2.txt, txtfile3.txt

同じ名前のすべてのファイルを別のフォルダにマージしたいです。

/home/parent/Merged ===> txtfile1.txt, txtfile2.txt, txtfile3.txt

ベストアンサー1

以下を使用できます。

mkdir "/home/parent/MERGED"
find "/home/parent/Folder1" -type f -name '*txt' -printf '%f\0' | 
xargs -0 -I FILENAME find "/home/parent" ! -path '/home/parent/MERGED/*' \
-type f -name FILENAME\
-exec sh -c 'cat "$1" >> "/home/parent/MERGED/$2"' sh {} FILENAME \;

できること:

  • 宛先ディレクトリの作成
  • FOLDER1をスキャンし、ファイル名(パスなし)を印刷してから、NULを区切り文字として使用します。
  • このリストを読むxargs
  • find各入力名に対して一度実行し、parentその名前のファイルを検索します。
  • この検索からターゲットディレクトリを除外
  • 結果をMERGEDで指定された名前のファイルにリンクします。

注:出力ファイルのデータは必ずしもFOLDER1、FOLDER2などの名前でソートされるのではなく、findファイルを検索した方法でソートされます。

注2:マージディレクトリを正しくフィルタリングするには絶対パスが必要です。

おすすめ記事