ファイル名は同じですが、異なるサイズの重複ファイルを削除する

ファイル名は同じですが、異なるサイズの重複ファイルを削除する

フォルダ_1

./a20160606_000000_000021.txt    5KB                                              
./a20160606_000000_000062.txt    5KB  
./a20160606_000000_000531.txt    5KB  
./a20160606_000000_004521.txt    5KB  
./a20160606_000000_003211.txt    9KB  
./a20160606_000000_009451.txt    9KB  
./b20160606_000000_000001.txt    4KB  
./b20160606_000000_000311.txt    6KB  
./b20160606_000000_000632.txt    8KB  
./b20160606_000000_000008.txt    9KB  
./b20160606_000000_000034.txt    12KB  
./b20160606_000000_000245.txt    12KB  
./b20160606_000000_000333.txt    12KB

フォルダ_2

./a20160607_000000_000001.txt    9KB                                              
./a20160607_000000_000002.txt    9KB  
./a20160607_000000_000311.txt    9KB  
./a20160607_000000_000500.txt    9KB  
./a20160607_000000_001121.txt    9KB  
./a20160607_000000_004891.txt    9KB  
./b20160607_000000_000021.txt    5KB  
./b20160607_000000_000065.txt    5KB  
./b20160607_000000_000091.txt    5KB  
./b20160607_000000_000134.txt    12KB  
./b20160607_000000_000521.txt    12KB  
./b20160607_000000_001111.txt    12KB

各フォルダには上記のファイルが含まれています。各ファイルのサイズは右側に表示されます(folder_1とFolder_2は同じフォルダにあります)。私の質問はこれらの重複ファイルを削除する方法であり、findファイルは各ファイルの最大サイズでなければなりません。出力は次のようになります。

フォルダ_1

./a20160606_000000_009451.txt    9KB  
./b20160606_000000_000333.txt    12KB

フォルダ_2

./a20160607_000000_000001.txt    9KB   
./b20160607_000000_001111.txt    12KB

ベストアンサー1

あなたの質問に厳密に答えるために、ファイル名に基づいて重複したファイルはありません。

ファイル名の最初の部分に基づいて最大のファイルを保持するには、次のawkスクリプトを使用して、プレフィックス(a20160606、a20160607など)に基づいて最大のファイルではなくファイル名(およびそのサイズ)を取得できます。最初の下線の前に):

find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
NAME=substr($1,0,9)
    SIZES[$1]=$2
    if ($2 > MAX[NAME]) {
        MAX[NAME]=$2
    }
}

END {
    for (x in SIZES) {
        for (y in MAX) {
            if (match(x,y) && SIZES[x] != MAX[y]) {
                printf "%s %d\n", x, SIZES[x]
            }
        }
    }
}'

見つかった最大値の名前(およびサイズ)のリストを取得するには、次のようにします。

find . -maxdepth 1 -type f -printf "%f %s\n"| awk '{
    NAME=substr($1,0,9)
    SIZES[$1]=$2
    if ($2 > MAX[NAME]) {
        MAX[NAME]=$2
    }
}

END {
    for (x in SIZES) {
        for (y in MAX) {
            if (match(x,y) && SIZES[x] == MAX[y]) {
                printf "%s %d\n", x, SIZES[x]
            }
        }
    }
}'

これを行うより簡単な方法があるかもしれませんが、削除するファイルのリストを取得するのに役立ちます。

おすすめ記事