Utmaning eller busenkelt?

Här diskuterar vi skal, kommandon och klassiska linuxverktyg.
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

Utmaning eller busenkelt?

Inlägg av Johnny Rosenberg »

Hej!

Satt och lekte med lite terminalkommandon för att se om det var möjligt att åstadkomma en sak utan att leta efter något program för ändamålet. Dock kom jag inte fram till någon tillfredsställande lösning. Så vad är det jag vill göra?

Tja... inget avancerat egentligen. Jag vill söka igenom en mapp med alla dess undermappar för att se om det finns dubbletter av filer. Låter inte så svårt, MEN vad menar jag med dubblett? Där är kruxet nämligen, för en nybörjare som jag: En dubblett kan vara en fil som är identisk med en annan fil, men med ETT ANNAT FILNAMN! Alltså kan man inte gå på filnamnet här!

Eftersom det oftast är frågan om bilder och dessa oftast är av jpeg-format, så kan man tänka sig att man filtrerar ut alla dessa, nämligen jpg och JPG.

Sedan tillåter jag mig ett visst manuellt arbete också, om inte annat för att snabba upp sökningen då man ju i regel har tusentals bilder på sin dator. Då blir det nog lite för mycket jobb för den stackars datorn att analysera varje byte i varje fil och dessutom jämföra alla med alla...

Så min tanke är följande arbetsgång:

1. Lista alla filer som slutar med .jpg och .JPG. I listan ska filnamn med fullständig sökväg finnas med liksom storlek angiven i bytes.
2. Listan ska vara sorterad på storlek.
3. Endast filer som har exakt samma storlek som en annan fil ska visas i listan. Och då menar jag exakt. En byte fel och det är ju garanterat ingen dubblett.

Någon som lämnat nybörjarstadiet som kan komma på en kul lösning?

Grundtanken är att klara detta med en enda kommandorad som ska matas in direkt i terminalen. Mest för att göra det lite svårare... ;D

I andra hand, om det skulle bli för svårt, kan en lösning med ett bash-skript kännas helt okej... som om jag är i position att ställa några som helst kvar här...  :D

Om ingen lyckas med detta så är det också okej; då slipper ju jag att känna mig som en idiot. Igen...  ;D
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Utmaning eller busenkelt?

Inlägg av Smygis »

Lekte lite i Python:

smygis@Bob:~$ mkdir test
smygis@Bob:~$ cd test/
smygis@Bob:~/test$ python
Python 2.5.1 (r251:54863, May  2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import glob, md5
>>> text = """Detta är en massa text
... som bara fortsätter och fortsätter!
... """ * 1000
>>> len(text)
63000
>>> open("Tehroxxorfile", "w").write(text)
>>> open("annanfil", "w").write(text)
>>> open("Tehroxxorfile2", "w").write(text+"1")
>>> filer = glob.glob("/home/smygis/test/*")
>>> filer
['/home/smygis/test/Tehroxxorfile', '/home/smygis/test/Tehroxxorfile2', '/home/smygis/test/annanfil']
>>> hs = [(md5.md5(open(i).read()).hexdigest(), i) for i in filer]
>>> for i in hs: print i
...
('efa6fc34073e1ce51c3b9dedcd54d922', '/home/smygis/test/Tehroxxorfile')
('3d1da3f8346400f63d7206618c5c51f6', '/home/smygis/test/Tehroxxorfile2')
('efa6fc34073e1ce51c3b9dedcd54d922', '/home/smygis/test/annanfil')

>>> for i in hs:
...     for c in hs:
...             if i[0] == c[0] and i[1] != c[1]:
...                     print "%s == %s" % (i[1], c[1])
...
/home/smygis/test/Tehroxxorfile == /home/smygis/test/annanfil
/home/smygis/test/annanfil == /home/smygis/test/Tehroxxorfile
>>>


Hash algorithmer <3

2 filer som är exakt lika stora kan fortfarande vara olika. (Faktiskt så kan 2 hashar av 2 olika filer vara lika varandra men sannorlikheten för det är mindre.)
Senast redigerad av 1 Smygis, redigerad totalt 6 gånger.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Utmaning eller busenkelt?

Inlägg av Johnny Rosenberg »

Smygis skrev:
2 filer som är exakt lika stora kan fortfarande vara olika. (Faktiskt så kan 2 hashar av 2 olika filer vara lika varandra men sannolikheten för det är mindre.)
Verkar som att jag får ta och lära mig Python någon dag. Satt nyss och lekte lite med C för första gången sedan början av 90-talet. Bara lite dyngprogram för att se om jag i alla fall minns något över huvud taget.

Jo, jag vet att filer som är exakt lika stora kan vara olika, men det är också där mitt resonemang om manuellt arbete kommer in. Får jag en lista på exakt lika stora JPG-filer, kan det ju hända att dessa inte är fler än att jag kan öppna dem och se om det är samma bild, helt manuellt, ELLER skriva ett litet program som, när detta urval är gjort, kollar de utvalda filerna exakt, byte för byte.

Man kanske kan tänka sig att lösa det hela exakt genom följande steg:
1. Skapa en lista av alla filer i en mapp (som användaren anger) och dess undermappar. Filens sökväg och storlek i bytes behöver ingå.
2. Sortera på exakt storlek
3. Ta bort alla rader som anger en unik filstorlek ur listan, alternativt skapa en ny lista med alla dubbletter.
4. Nu, när vi förhoppningsvis har en kraftigt reducerad lista, där alla uppenbart irrelevanta rader är bortplockade, kan vi jämföra de filer som har exakt samma filstorlek med varandra, byte för byte, med hjälp av raderna i listan. Är filerna olika är det osannolikt att man behöver jämföra särskilt många bytes. Vid första olikhet är det ju bara att avbryta och gå vidare till nästa filpar. Det är bara när filerna är exakt lika som det kommer att ta tid.
5. De filer som visade sig vara exakt lika listas med sökväg och allt och ger användaren möjlighet att markera valfri fil för borttagning.

Så nu är det inte terminalkommandon vi pratar om längre, antar jag... Känns som ett bra läge att börja öva lite C igen eller kanske C++ (av den enda anledningen att det är två av de få språk jag lekt med tidigare i mitt liv).

Varför jag pratade om terminalkommandon från början var väl mest för att jag läste någonstans att man kan göra det mesta med sådana utan att behöva programmera och så vidare. Någon som vill bevisa dess förträfflighet? ;D

Johnny Rosenberg
Senast redigerad av 1 Johnny Rosenberg, redigerad totalt 6 gånger.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Konservburk
Inlägg: 5919
Blev medlem: 07 apr 2007, 22:28

SV: Utmaning eller busenkelt?

Inlägg av Konservburk »

Johnny Rosenberg skrev: Tja... inget avancerat egentligen. Jag vill söka igenom en mapp med alla dess undermappar för att se om det finns dubbletter av filer. Låter inte så svårt, MEN vad menar jag med dubblett? Där är kruxet nämligen, för en nybörjare som jag: En dubblett kan vara en fil som är identisk med en annan fil, men med ETT ANNAT FILNAMN! Alltså kan man inte gå på filnamnet här!

Eftersom det oftast är frågan om bilder och dessa oftast är av jpeg-format, så kan man tänka sig att man filtrerar ut alla dessa, nämligen jpg och JPG.
Johnny Rosenberg skrev: Grundtanken är att klara detta med en enda kommandorad som ska matas in direkt i terminalen. Mest för att göra det lite svårare... ;D
Detta listar "klumpvis" .jpg-filer som har samma md5:

Kod: Markera allt

find . -type f -iregex '.*\.jpe?g' -print0 | xargs -0 md5sum | sort | uniq -w32 --all-repeated=prepend | cut -d' ' -f2-
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Utmaning eller busenkelt?

Inlägg av Johnny Rosenberg »

Oj, där ser man! Och det verkar fungera också. Ungefär hur stor är sannolikheten att två OLIKA filer har samma md5sum?

Är det större sannolikhet att två olika filer har samma md5sum om filerna är exakt lika stora?

J.R.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Utmaning eller busenkelt?

Inlägg av Smygis »

Johnny Rosenberg skrev: Oj, där ser man! Och det verkar fungera också. Ungefär hur stor är sannolikheten att två OLIKA filer har samma md5sum?

Är det större sannolikhet att två olika filer har samma md5sum om filerna är exakt lika stora?

J.R.
1 på 1208925819614629174706176.

Nej. snarare mindre.
Senast redigerad av 1 Smygis, redigerad totalt 6 gånger.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

SV: Utmaning eller busenkelt?

Inlägg av Johnny Rosenberg »

Kanon!
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Emil.s
Inlägg: 6633
Blev medlem: 12 dec 2006, 23:20
OS: Ubuntu
Ort: /Dalarna/Hedemora/
Kontakt:

SV: Utmaning eller busenkelt?

Inlägg av Emil.s »

Smygis skrev:
Johnny Rosenberg skrev: Oj, där ser man! Och det verkar fungera också. Ungefär hur stor är sannolikheten att två OLIKA filer har samma md5sum?

Är det större sannolikhet att två olika filer har samma md5sum om filerna är exakt lika stora?

J.R.
1 på 1208925819614629174706176.

Nej. snarare mindre.
Mycket mindre... ;)
16^32= 3.4028e+38

Vill man överdriva så kan man använda "sha512sum". Då får man 16^128 alternativ (1.3408e+154). Dvs 1.3 med 153 nollor efter.  8)
Home sweet ~/ = http://sandnabba.se
Användarvisningsbild
Smygis
Inlägg: 849
Blev medlem: 21 jun 2006, 18:41
OS: Ubuntu
Utgåva: 24.04 Noble Numbat LTS
Ort: Kramfors

SV: Utmaning eller busenkelt?

Inlägg av Smygis »

Emil.s skrev:
Smygis skrev:
Johnny Rosenberg skrev: Oj, där ser man! Och det verkar fungera också. Ungefär hur stor är sannolikheten att två OLIKA filer har samma md5sum?

Är det större sannolikhet att två olika filer har samma md5sum om filerna är exakt lika stora?

J.R.
1 på 1208925819614629174706176.

Nej. snarare mindre.
Mycket mindre... ;)
16^32= 3.4028e+38

Vill man överdriva så kan man använda "sha512sum". Då får man 16^128 alternativ (1.3408e+154). Dvs 1.3 med 153 nollor efter.  8)
:) råkade köra 32^16.
A Foolish Consistency is the Hobgoblin of Little Minds.Beware: In C++, your friends can see your privates!
TicToc
Inlägg: 2266
Blev medlem: 27 dec 2006, 17:28
OS: Kubuntu
Utgåva: 20.04 Focal Fossa LTS

SV: Utmaning eller busenkelt?

Inlägg av TicToc »

Emil.s skrev: Dvs 1.3 med 153 nollor efter.  8)
Är inte det fortfarande 1.3  ;D (jag förstår vad du menar)
Skriv svar

Återgå till "Terminalforum"