Usuwanie duplikatu pliku o dokładnie takiej samej nazwie, ale różnych rozmiarach

-1

folder_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

folder_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

Mam te foldery, każdy folder zawiera pliki powyżej. Rozmiar każdego pliku jest wskazany po prawej stronie (folder_1 i folder_2 znajdują się w tym samym folderze). Moje pytanie brzmi: jak usunąć te zduplikowane pliki, finda plik musi pozostać musi być największy dla każdego pliku. Dane wyjściowe muszą być takie:

folder_1

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

folder_2

./a20160607_000000_000001.txt    9KB   
./b20160607_000000_001111.txt    12KB
p_p
źródło
2
Jak możesz mieć takie same pliki w katalogu?
Keyshov Borate
właściwie nie wiem, czy większość danych działała jak te, dane te zostały dopiero wyodrębnione.
p_p
1
Nie możesz mieć plików o dokładnie takiej samej nazwie w jednym katalogu. Podaj bardziej szczegółowe informacje, takie jak używany system plików i bardziej szczegółową listę katalogów (tj. find folder_1 -type f), Aby wyjaśnić pytanie.
Lambert
1
jak teraz zdecydowałbyś, że chcesz przechowywać ./a20160606_000000_009451.txt & ./b20160606_000000_000333.txtpliki w folderze 1?
Rahul
1
Proszę edytować swój post i wyjaśnić, co rozumiemy przez zduplikowanych plików. Jak powiedzieli ci inni, w twoim przykładzie nie ma duplikatów plików. Twój wynik sugeruje, że oczekujesz usunięcia wszystkich plików z obu folderów oprócz dwóch. Dlaczego te dwie są przechowywane?
terdon

Odpowiedzi:

1

Aby ściśle odpowiedzieć na twoje pytanie, nie masz duplikatów plików opartych na nazwie pliku.

Jeśli chcesz zachować największe pliki na podstawie pierwszej części nazwy pliku, możesz użyć następującego awkskryptu, aby uzyskać nazwy plików (wraz z ich rozmiarami), które nie są największe na podstawie prefiksu, aż do pierwszego podkreślenia (a20160606, a20160607, itp.):

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]
            }
        }
    }
}'

Aby uzyskać listę nazw (i ich rozmiarów) znalezionych wartości maksymalnych:

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]
            }
        }
    }
}'

Prawdopodobnie są na to łatwiejsze sposoby, ale może to pomoże w uzyskaniu listy plików do usunięcia.

Lambert
źródło