Hvordan sortere og fjerne dupliserte bilder i Linux


Digitale kameraer gjør det enkelt å samle opp gigabyte fotoarkiv. La oss lære å finne duplikater og organisere alle bildene dine uten å gjøre det ditt livsverk.

Før du gjør noe, må du ha en god backup av bildefilene.

I gamle dager fotografering vi trodde var klar for noe med et par 36-bilders film kassetter i våre poser. Nå kan vi fange gigabyte med bilder på bare noen få minutter, uten omlasting. Jeg har en 32GB kort i kameraet mitt, som har 1700 + RAW-bilder på 18 MB hver. Ikke bekymre deg, vil jeg ikke gjøre at du ser på dem alle. Pokker, jeg trenger ikke engang vet hva jeg har. I løpet av de årene jeg har laget duplikater ved å dumpe dem på datamaskinen min når jeg hadde det travelt, og sikkerhetskopiering uten rim eller grunn, så jeg ønsker å jakte ned alle duplikater og bli kvitt dem. Men jeg ser på 205GB bilder:

 $ du SH Pictures /205g Pictures /

Hvor mange bilder er det? Liker, en måte mye. La oss bruke finne for å telle dem. Alle bildene mine er i en enkelt katalog, Bilder, så jeg trenger ikke å søke i flere kataloger. Dette teller alle filene i bilder uten å telle kataloger:

 $ finne Pictures /-type f | wc -l 30481 

Oh my, det er en masse bilder. Så hvor mange er duplikater? Igjen, slår vi å finne. Dette besvergelse vil ta litt tid å kjøre, avhengig av hastigheten på datamaskinen og størrelsen på bildearkivene. Den finner duplikater ved å generere og matchende en md5sum hash på hver fil, og deretter bruke sort og uniq å skrive ut alle foto filnavn i en tekstfil, med duplikater oppført sammen og adskilt av en blank linje. Den finner bare duplikater, og vil ikke telle filer som ikke er duplisert:

 $ finne Pictures /-type f-exec md5sum '{}' ';' | sort | uniq --Alle gjentatte = separat -w 15 > dupes.txt 

Resultatet ser slik ut this:

Pictures/unsorted-pics/Pictures/dump/IMG_4532.CR2Pictures/Pictures-oldish/2009-4-7/2009-12-27a/IMG_4532.CR2Pictures/unsorted-pics/Pictures/dump/IMG_4883.CR2Pictures/2010-01-07/img_4883.cr2Pictures/Pictures-realhome/2010/2010-01-07/img_4883.cr2Pictures/Pictures-realhome/2011/jan-2011/img_4883.cr2

Wonderful! Noen av bildene mine er duplisert fire ganger. Nå hvordan å telle disse? wc -l teller alle linjene:

 $ wc -l dupes.txt14156 dupes.txt 

Som ikke er veldig nyttig, fordi det inneholder tomme linjer. awk teller bare de linjene med filnavn, og ikke de tomme linjene: «NF = 0 {++ count} END {print count}

 $ awk dupes.txt9855 

Det er litt bedre. Kun 9855 bilder å vasse gjennom. Hvor mange av disse er duplikater? La oss telle unike filer med awk. Denne fantastiske besvergelse ser etter de tomme linjer, og deretter teller bare linjen umiddelbart etter en blank linje:

 $ awk '/^ $ /{getline; print;} dupes.txt | wc -l4301 

Så jeg har 4301 unike bilder og 5554 duplikater å luke ut. På dette punktet kan jeg brolegge opp en forbindelse kommando for å flytte eller slette duplikater, men det finnes enklere verktøy for å gjøre dette.

fdupes finner og fjerner duplikatfiler

En annen måte å se etter duplikater er med fdupes kommandoen, hvis eneste jobb i livet er å finne dupliserte filer, samt eventuelt å slette dem. Det fungerer som vår lange finne kommandoen, ved hjelp av md5sums, med fordelen av å være enklere å bruke. Den har et enkelt sett med alternativer som du kan lese alt om i menneske fdupes, og det viser en fremdriftsmåler som det fungerer. Dette eksempelet teller opp alle duplikater i Bilder, og hvor mye diskplass de bruker:

 $ fdupes -rSm Pictures /5554 dupliserte filer (i 4301 sett), opptar 41484.8 megabyte 

Det er betryggende å se awk og fdupes gi de samme resultatene.

fdupes vil også slette like filer med d alternativet, og ber deg om å bekrefte hver sletting. Bruk N muligheten til å slå av meldingen bekreftelse og for å slette alle duplikater uten å bry deg.

FSlint

Jeg er sikker på at noen av dere vinke med hendene og går "Hei, hva om FSlint? " FSlint er min verktøyet for denne jobben.


FSlint, "filsystem lo", er en fin grafisk filsystem renere som finner og fjerner duplikater, og en rekke andre funksjoner som å finne overflødige mellomrom, tomme kataloger, dårlige symlinks, filer med mangler bruker-ID, og ​​liste installerte pakker. Som standard ekskluderer det tapte + funnet, /dev, /proc, /sys, og /tmp, pluss git, CVS, svn, og BZR filer. Du kan finjustere listen utelukkelse av hjertens lyst.

FSlint er svært enkel å bruke. Fortelle den hva katalog eller kataloger til søk, klikk på Finn, og deretter gå bort og la det virke. Når det er ferdig det gir deg en liste over filer organisert på samme måte som i vårt eksempel dupes.txt. Klikk på Velg-knappen for å velge hvilke filer som skal slettes: alle unntatt den første i hver gruppe, alle bortsett fra det nyeste, eller alle, men de eldste. Jeg velger alle unntatt den første i hver gruppe, og klikk deretter Slett. (Flossmanuals.net har en fin FSlint manual.)


Selvfølgelig, alle disse kommandoene arbeide på en fil, og ikke bare fotografier. Så nå la oss se på et flott verktøy for digitale fotografier. Exiftool

ExifTool, Swiss Army Knife of Digital Bilder fra

Vi har sett på å bruke ImageMagick å behandle digitale bilder i Hvordan endre størrelsen på , endre navn, sortere og Proof Bilder fra kommandolinjen. Nå jeg vil du skal møte ExifTool. ExifTool er en glimrende lite verktøy som leser, skriver og redigerer metadata på de fleste bildefilformater. Sine mest grunnleggende bruk viser alle EXIF-data i et bilde:

 $ exiftool photo.jpgFile Tillatelser: rw-r - r - File Type: CR2Exif Byte Order: Little-endian (Intel, II) Bilde Bredde: 5184Image Høyde: 3456Camera Modellnavn: Canon EOS 7DExposure Tid: 1 /400F Antall: 6.3ISO: 100Focal Lengde: 190,0 mmLens Type: Canon EF 100-400 mm f /4.5-5.6L IS 

Det er bare en liten prøvetaking , som den samlede EXIF-data for dette bildet går til 324 linjer. Så, nå som du har tatt vare på duplikater problem, la oss finne ut noen måter å organisere alle disse bildene. En enkel metode for organisasjonen er etter dato. Dette eksemplet flytter alle bildene i en katalog til en ny overordnet katalog, med underkataloger oppkalt etter dato:

 $ exiftool '-Directory < CreateDate' -d newdir /% Y-% m-% d -r olddir /

Dette er hvordan det ser ut i en av mine kataloger:

 $ exiftool '-Directory < CreateDate' -d sortert-pics /% Y-% m-% d -r usorterte-pics /1 kataloger skannet 56 kataloger opprettet 91 bildefiler oppdatert 

Resultatet ser slik ut:

 $ ls -1 sortert-pics /2008-09-202009-04-142009-10-032010-02-182011- 03-19 

En annen måte å gjøre dette på er å skape foreldrekataloger per år. Dette eksemplet etiketter underkataloger med år og måned:

 $ exiftool '-Directory < CreateDate' -d newdir /% Y /% Y-% m -r olddir /

For forsikring, du kan kopiere filene i stedet for å flytte dem ved å legge o alternativet:

 $ exiftool -o '-Directory < CreateDate' -d newdir /% Y /% Y-% m -r olddir /

Selvfølgelig kan du bruke en hvilken som helst dato og klokkeslett formatet du ønsker, ved hjelp av disse makroene:% Y% m% d% H% M% S. Størst mann strftime for en komplett dato og tid referanse. Anmeldelser