Nowe posty

Autor Wątek: [bash] znajdowanie plików o tej samej treści i sortowanie ich  (Przeczytany 6650 razy)

lukassz

  • Gość
Witajcie mam problem ze skryptem, myślałem aby tu użyć polecenia diff i kliku pipeów, ale chyba nie będzie tak prosto. Tutaj treść polecenia:

Napisz skrypt, który znajduje takie same pliki w podanym
katalogu oraz podkatalogach i wyświetla je w terminalu posortowane w
kolejności malejącej po wielkościach plików (z pełną ścieżką), czyli
na początku zostaną wyświetlone duplikaty plików które zajmują
najwięcej miejsca na dysku. Pliki są takie same jeśli mają taką samą
zawartość nie jeśli mają takie same nazwy i/lub wielkość.

Prosiłbym o radę.

Pozdrawiam

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3066
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
[bash] znajdowanie plików o tej samej treści i sortowanie ich
« Odpowiedź #1 dnia: 2014-01-14, 15:41:16 »
Megapodpowiedź:

1. Załóż, że suma MD5/SHA pliku to jego zawartość.
2. Pliki o tym samym MD5/SHA prawie na pewno będą miały tą samą długość (jak nie, to czym prędzej leć zagrać w totka)
3. masz duet sort/uniq do szukania powtórzeń.
4. Program md5deep wyświetla wszystko, co jest potrzebne do rozwiązania (długość, suma, ścieżka)
$> md5deep -zr /bin                                                                                                                                          
    119408  1f1e1c100c56aa8ef9e4fefdf879f67f  /bin/csplit                                                                                                                  
     28320  2ec042ff67e77d4dc53615c8e519b848  /bin/gnomevfs-mkdir                                                                                                          
     39576  a92c734a9d6661050e6a5f6acda452da  /bin/ngettext                                                                                                                
      5859  71c53f5c0c0529f82b5a4a01a77feddc  /bin/mailstat                                                                                                                
     11720  737a6f1e3845227dfdadb42004cc9096  /bin/python2.7                                                                                                                
     19440  407ac8e662e61bd01fd69409a6eb6a79  /bin/abrt-dump-oops                                                                                                          
     44856  9d256b9a7ad13ca6bb7637917d78c106  /bin/card_eventmgr                                                                                                            
     15560  15dbfc42f1163d85ad94200a81435ba5  /bin/arjdisp    
...
...
Zgrabnym potokiem uzyskujesz wynik:
$> md5deep cośtamcośtam | sort cośtamcośtam | uniq cośtamcośtam

    860728  3502c8fea671183301fe641b3d4397c0  /sbin/sendmail.sendmail                                                                                                      
    860728  3502c8fea671183301fe641b3d4397c0  /sbin/sendmail                                                                                                                

    430728  7990fbe0bf7c7a325e44dbb68c7e7759  /sbin/btrfsck                                                                                                                
    430728  7990fbe0bf7c7a325e44dbb68c7e7759  /sbin/btrfs                                                                                                                  

    403056  f2b81d5280e5e7bcdc5d3add1aa8e85d  /sbin/fsck.hfsplus                                                                                                            
    403056  f2b81d5280e5e7bcdc5d3add1aa8e85d  /sbin/fsck.hfs                                                                                                                

...
...
Cośtamcośtam doczytaj sobie w instrukcjach do poleceń.
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

lukassz

  • Gość
[bash] znajdowanie plików o tej samej treści i sortowanie ich
« Odpowiedź #2 dnia: 2014-01-14, 18:51:03 »
Ok, tylko nie mogę wybrać parametrów do sort i uniq :/

Offline Paweł Kraszewski

  • Administrator
  • Guru
  • *****
  • Wiadomości: 3066
  • Lenistwo jest matką potrzeby = babcią wynalazku
    • Zobacz profil
[bash] znajdowanie plików o tej samej treści i sortowanie ich
« Odpowiedź #3 dnia: 2014-01-15, 10:24:38 »
A tego już usługa nie obejmuje :)
Paweł Kraszewski
~Arch/Void/Gentoo/FreeBSD/OpenBSD/Specjalizowane customy

darkdancer

  • Gość
[bash] znajdowanie plików o tej samej treści i sortowanie ich
« Odpowiedź #4 dnia: 2014-01-15, 13:53:42 »
Cytat: lukassz
Ok, tylko nie mogę wybrać parametrów do sort i uniq :/
To proste ja Ci pomogę: sortuj po drugiej kolumnie czyli hashu, unikalne wypisz wszystkie duplikaty linii, ale sprawdzaj tylko znaczącą ilość początkowych znaków czyli rozmiar i hash bo w końcu ścieżka do pliku i nazwa może się różnić, najlepiej separowane żeby uzyskać taki pro-listing jak pkraszewski ;-) Większy problem to czy wykładowca zadowoli się takim bajecznym poleceniem jak md5deep, które niszczy zupełnie element edukacyjny zadania :-( Nie wspominając już o rozwiązywaniu zadań na forach...

Offline ultr

  • Users
  • Guru
  • *****
  • Wiadomości: 1177
    • Zobacz profil
[bash] znajdowanie plików o tej samej treści i sortowanie ich
« Odpowiedź #5 dnia: 2014-01-15, 23:26:27 »
md5deep można zastąpić findem i md5sum/sha1sum.

Jednolinijkowiec:
find . -type f -exec md5sum {} ';' | sed -r 's/ +/ /g' | sort | rev | uniq -f 1 -D | rev | xargs -I @ sh -c "echo -n '@ '; echo '@' | cut -d' ' -f2 | xargs stat -c %s" | sort -n -k3 -r
Podaję rozwiązanie, bo jeśli chcesz coś takiego przedstawić na ćwiczeniach, to na pewno będziesz musiał się gęsto tłumaczyć z jego składni, a więc wcześniej je zrozumieć.

PS. Jeśli ktoś wie jak uprościć to polecenie, to sugestie mile widziane :)

darkdancer

  • Gość
[bash] znajdowanie plików o tej samej treści i sortowanie ich
« Odpowiedź #6 dnia: 2014-01-17, 19:49:52 »
Cytat: ultr
PS. Jeśli ktoś wie jak uprościć to polecenie, to sugestie mile widziane :)
Print w find nie jest potrzebny w konsoli linuksowej, dodałem bo md5sum z cygwin z jakiegoś powodu dodaje asterisk przed nazwą pliku na wyjściu. Pewnie te dwa awk da się zastąpić jednym ale jestem leszczem jeśli idzie o awka
Kod: bash [Zaznacz]
find . -type f -exec md5sum {} \\; -print -exec stat -c %s {} \\; | awk 'ORS=NR%3?" ":"\\n"' | awk '{print $3" "$4" "find . -type f -exec md5sum {} \\; -print -exec stat -c %s {} \\; | awk 'ORS=NR%3?" ":"\\n"' | awk '{print $3" "$4" "$1}' | sort -k3 | uniq --all-repeated=separate -f1}' | sort -k3 | uniq --all-repeated=separate -f1