多くのファイルを含むフォルダがあり、各フォルダには同じ名前の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:マージディレクトリを正しくフィルタリングするには絶対パスが必要です。