Toon posts:

[Fedora]Shell script om duplicate files te zoeken

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor school moet ik een shell script schrijven wat voor mij gaat uizoeken of er duplicate files zijn. Ik moet zelf een file opgeven.
Gebruikte synopsis: find_duplicates <file> <dir>.
Ik heb al gezocht op google maar heb tot nu toe niets kunnen vinden. Nou ja niet helemaal waar ik heb wel wat kunnen vinden maar dit was met AWK er bij en dat mag nog niet omdat we daar na de vakantie pas mee beginnen.
Iemand die mij kan helpen?

  • xzenor
  • Registratie: Maart 2001
  • Laatst online: 14-10-2022

xzenor

Ja doe maar. 1 klontje suiker.

kijk eens naar de commando's sort en uniq
En als je echt dik wilt scoren gebruik je de md5 checksum om te kijken of de bestanden echt hetzelfde zijn of dat het alleen de filenames zijn..

  • Buffy
  • Registratie: April 2002
  • Laatst online: 26-12-2024

Buffy

Fire bad, Tree pretty

Met md5sum (of cksum) kan je checksums genereren welke je vervolgens kan sorteren mbv sort.
Aangezien je geen awk mag gebruiken zul je zelf mbv while read een loopje moeten maken die telkens de checksum van de ingelezen regel vergelijkt met de die van de vorige regel.
Als de checksums overeen komen kan je voor de zekerheid de bestanden nog een keer vergelijken mbv cmp.

Voor het opsplitsen van de regel in een checksum gedeelte en de bestandsnaam kan je het commando cut gebruiken voor md5sum output wordt het dan:
code:
1
2
checksum=`echo "$regel" | cut '-d ' -f1`
filenm=`echo "$regel" | cut '-d ' -f2-`


Houdt overigens in je script rekening met spaties in de bestandsnaam, dus "$@" ipv $* en gebruik " om variable in tests.

-edit-
PS: Als je slechts voor 1 bestand de duplicates hoeft te zoeken dan kan je beter grep gebruiken ipv sort om alleen de juiste checksums eruit te vissen en die mbv het while read loopje te controleren.

De vraag is dan wel wat sneller is, eerst checksums bepalen en dan een compare doen of gelijk met een for loopje alle bestanden gelijk checken mbv cmp.
Als je alle duplicates uit een set bestanden zoekt is de checksum methode (waarschijnlijk) efficienter .

[ Voor 23% gewijzigd door Buffy op 19-10-2006 15:07 ]

That which doesn't kill us, makes us stranger - Trevor (AEon FLux)
When a finger points at the moon, the imbecile looks at the finger (Chinese Proverb)


Verwijderd

Topicstarter
Harstikke bedankt! Nu kan ik weer verder :D

  • xzenor
  • Registratie: Maart 2001
  • Laatst online: 14-10-2022

xzenor

Ja doe maar. 1 klontje suiker.

Hm, ik weet dat TS zijn antwoord heeft..
Maar hoe zit dat met de $@ als ik vragen mag?
Ik heb altijd problemen met spaties in filenames..

Hoe gebruik je die $@ ?
Op dezelfde manier als een $ lijkt mij een beetje te simpel......

linkje naar en site is ook prima hoor maar google maar eens op $@.. dat geeft gare resultaten :(

  • Buffy
  • Registratie: April 2002
  • Laatst online: 26-12-2024

Buffy

Fire bad, Tree pretty

Het probleem van $* is dat argumenten met spaties opgesplits worden. Voer het volgende script maar eens uit met argumenten met spaties erin (escaped of beschermt met quotes):

code:
1
2
3
4
5
#!/bin/sh

for i in $*; do
   echo $i
done


Dubbele quotes om $* heen helpen niet omdat dan alle argumenten samen 1 argument worden.
Daarom hebben ze "$@" uitgevonden (dubbele quotes zijn belangrijk!).
Argumenten blijven dan apart maar argumenten met spaties blijven behouden (worden niet opgesplitst).

code:
1
2
3
4
5
#!/bin/sh

for i in "$@"; do
   echo $i
done

That which doesn't kill us, makes us stranger - Trevor (AEon FLux)
When a finger points at the moon, the imbecile looks at the finger (Chinese Proverb)

Pagina: 1