フォルダ_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]
}
}
}
}'
これを行うより簡単な方法があるかもしれませんが、削除するファイルのリストを取得するのに役立ちます。