フォルダ間の類似した名前のファイルをサイズで比較

フォルダ間の類似した名前のファイルをサイズで比較

それぞれ数千のファイルを含む2つのフォルダがあります。昨年の1つのフォルダには、各ファイルに文字と年の接頭辞(a2020abc123.txt)があり、今年の同じファイルは同じ形式の別のフォルダ(a2021abc123.txt)にあります。昨年と今年の間で大きく異なるファイルを見つけるには、これら2つのフォルダを比較する必要があります。私たちのチームはいつもこんなことをします。手でだから私はより速く、エラーが少なくなる方法を望んでいます。

たとえば、

/folder1/a2021fileA123.txt 50kb
/folder2/a2022fileA123.txt 80kb
/folder1/a2021fileA124.txt 79kb
/folder2/a2022fileA124.txt 80kb
/folder1/a2021fileA125.txt 90kb
/folder2/a2022fileA125.txt 80kb

理想的には、次の内容が返されます。

/folder1/a2021fileA123.txt 50kb
/folder2/a2022fileA123.txt 80kb
/folder1/a2021fileA125.txt 90kb
/folder2/a2022fileA125.txt 80kb
/folder1/a2021fileA124.txt 79kb
/folder2/a2022fileA124.txt 80kb

上記のようにファイルのペアをまとめてグループ化する必要があります。私はawkのようなツールを使用することは非常に慣れていないと私たちのチームはpowershellを好む。とても感謝しています。私はその後数週間夢でこのファイル名を見ました。

答え1

これで何をしたいのかわかりません。少なくとも開始点は次のとおりです。これにより、フォルダ内のファイルを見つけて印刷でき、前にサイズ(バイト)が付けられます。

find folder1 folder2 -type f -printf '%s %P\n'

たとえば、質問のリストを手動で編集するだけです。

50000 a2021fileA123.txt
80000 a2022fileA123.txt
79000 a2021fileA124.txt
80000 a2022fileA124.txt
90000 a2021fileA125.txt
80000 a2022fileA125.txt

このawkコマンドにパイプすると、2022バージョンファイルと2021バージョンファイルのサイズの違いが出力されます。

$ cat tst.awk
{
    size = $1
    year = substr($2,2,4)
    base = substr($2,6)
    bases[base]
    map[base,year] = size
}
END {
    for ( base in bases ) {
        print base, map[base,2022] - map[base,2021]
    }
}

$ find folder1 folder2 -type f -printf '%s %P\n' | awk -f tst.awk
fileA125.txt -10000
fileA123.txt 30000
fileA124.txt 1000

sortサイズの違いに応じて出力を並べ替えるには、以下をパイプします。

$ find folder1 folder2 -type f -printf '%s %P\n' | awk -f tst.awk | sort -k2,2rn
fileA123.txt 30000
fileA124.txt 1000
fileA125.txt -10000

お役に立てば幸いです。

答え2

あなたはする必要がありますdiff

#!/bin/sh
cd folder1
for f in *
do
   diff $f ../folder2/$f
done

関連情報