find -exec md5sum {} liefert nur die letzte Zeile

Hinweis: In dem Thema find -exec md5sum {} liefert nur die letzte Zeile gibt es 7 Antworten. Der letzte Beitrag () befindet sich ganz unten auf dieser Seite.
  • Hallo,


    ich schreibe ein bash-Script um doppelt vorhandene Bilddateien zu finden.

    Der Plan ist, eine Liste aller Bilddateien samt Hash zu erstellen und darin dann doppelte Hashwerte zu finden.


    Ich bin letztlich ziemlicher Anfänger im scripten, auch wenn ich schon ein paar umfangreichere Scripte gebaut habe, ist aber eine Weile her.


    Mit (1)

    Code
    find -files0-from $pfadliste -type f $muster > $dateiliste

    bekomme ich eine korrekte Liste aller Bilddateien in den in pfadliste angegebenen Pfaden, die muster entsprechen. Auszug:

    Code
    /home/medias/Baumbilder/a.Import/ebay/Disto/497_0508/IMG_4901.JPG
    /home/medias/Baumbilder/a.Import/ebay/504_2609/IMG_5299.JPG
    /home/medias/Baumbilder/x.Seltene/Mutz Sammern Moos/Eiche Mutz Sammern/GA 2020-02-21/leica/2020-02-21___12-29-09.JPG
    /home/medias/Baumbilder/x.Seltene/Mutz Sammern Moos/Eiche Mutz Sammern/Textdatei.png


    Wenn ich

    Code
    find -files0-from $pfadliste -type f $muster -exec md5sum {} >> $dateiliste \;

    laufen lasse, bekomme ich genau die Ausgabe, die ich wünsche,

    Code
    d784fa8b6d98d27699781bd9a7cf19f0  /home/medias/Baumbilder/x.Seltene/Mutz Sammern Moos/Eiche Mutz Sammern/Textdatei.png

    aber leider nur die letzte Zeile.

    Was muss ich ändern, damit auch mit Hash die ganze Liste in dateiliste erscheint? Eigentlich sollte >> doch anfügen?


    Als Workaround würde ich die ganze mit (1) erzeugte Dateiliste nochmal durcharbeiten, um eine Liste mitsamt Hashes zu bekommen, aber das ist ja doppelt gemoppelt, wenig elegant und bei einigen tausend Bildern auch zeitaufwendig. Und außerdem lerne ich dann nichts.


    Dankbar für Tips....

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 297673 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • Falls du das nicht gerade zum Auffrischen deiner Scriptingkenntnisse machst, brauchst du das Rad nicht neu zu erfinden. Es gibt schon ein Tool, welches das für verschiedenste Dateitypen erledigen kann (Filename und auch Inhalt).


    Dupeguru

    dupeGuru is a tool to find duplicate files on your computer. It can scan either filenames or contents. The filename scan features a fuzzy matching algorithm that can find duplicate filenames even when they are not exactly the same.

    dupeGuru is good with pictures. It has a special Picture mode that can scan pictures fuzzily, allowing you to find pictures that are similar, but not exactly the same.

    dupeGuru is customizable. You can tweak its matching engine to find exactly the kind of duplicates you want to find. The Preference page of the help file lists all the scanning engine settings you can change.

    dupeGuru is safe. Its engine has been especially designed with safety in mind. Its reference directory system as well as its grouping system prevent you from deleting files you didn’t mean to delete.

    Do whatever you want with your duplicates. Not only can you delete duplicates files dupeGuru finds, but you can also move or copy them elsewhere. There are also multiple ways to filter and sort your results to easily weed out false duplicates (for low threshold scans).


    Installieren kannst du das aus diesem Repository (openSUSE 15.3; falls andere Version, URL bitte anpassen). Repository einbinden, priorisieren und dann installieren.




    Ansonsten noch viel Spass beim Hacken.

  • Dankeschön, das scheint jedenfalls eine sehr gute Möglichkeit.

    Falls du das nicht gerade zum Auffrischen deiner Scriptingkenntnisse machst

    Naja, irgendwie halt auch...

    ... es steht noch ein Wechsel von Evolution zu Thunderbird an, mit 20GB mails, > 100 Mailordnern und über 1000 Kontakten mit Fotos, zig Listen...

    da habe ich bisher keine Tools gefunden und mache mich gern wieder etwas Konsolen-fitter.


    dupeguru werde ich mir auf jeden Fall anschauen.


    Klingt meine Ausgangsfrage denn kompliziert, nicht nur irgendwo ein "," vergessen oder so?

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 297677 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • OT

    und über 1000 Kontakten

    Bist du mit der halben Welt im Gespräch? ˝ł

  • Klingt meine Ausgangsfrage denn kompliziert, nicht nur irgendwo ein "," vergessen oder so?

    Es gibt hier Leute, die das beantworten können. Da ich aber keine Skripte schreibe, kann ich da nichts dazu sagen.

    Da musst du eben etwas Geduld aufbringen.

  • Bist du mit der halben Welt im Gespräch? ˝ł

    Ist der Rechner meiner Freundin. Seit 20 Jahren Kurse leiten, da kommt dann was zusammen.

    Z.B. auch >20 GB an Emails, weil sämtliche Anhänge immer dran bleiben, teils mit "Antworten" als Inline-"Anhang" x-fach hin und her geschickt... das wird sich aber nicht mehr "reparieren" lassen.

    Kmail steigt da aber definitiv aus.


    Da musst du eben etwas Geduld aufbringen.

    Mache ich. Dir dann erstmal vielen Dank :thumbup: .

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 297681 haftet ausdrücklich der jeweilige Autor: baumkraxler

  • Ich hätte da aber eine Software für dich, die das für dich erledigt. Nennt sich ShellCheck und kann von hier https://github.com/koalaman/shellcheck installiert werden. Hab es selber noch nicht getestet, kenne aber Leute, die das für gut befinden. Vielleicht hilft es dir und auch anderen Usern weiter?!

    Ach, noch was, die Entwickler bieten auch einen Online-Test für Scripte an. Rufe einfach shellcheck.net auf und kopiere dein Script dort hin.

    Warum das Rad neu erfinden?

  • Ich hätte da aber eine Software für dich, die das für dich erledigt. Nennt sich ShellCheck

    Habe das grad online mal probiert, es hat mich jedenfall mehrfach darauf

    Double quote to prevent globbing and word splitting. hingewiesen,

    weil ich einige Variablen, deren Sauberkeit mir klar schien, nicht gequotet hatte.


    Das hat mich letztlich der Lösung näher gebracht, denn mein Suchmuster -iname *.jp*g -o -iname *.png,

    das ich aus Flexibilitätsgründen am Anfang als Variable gesetzt habe, funktioniert grundsätzlich.

    Wenn ich aber -exec dahinter verwende, bezieht find das nur auf den letzten Teil hinter -o(r).

    Und alles vor dem -o wird verschluckt, weil -exec die standardweise Ausgabe untergräbt.


    Es kamen also nur *.png-Dateien raus, und da gibt es nur die eine von mir künstlich reingesetzte im Testsystem.


    Lösung: Entweder als Suchstring muster="-iname *.[pj][np]*g" verwenden, oder aber Klammern benutzen:

    find -files0-from "$pfadliste" -type f \( -iname "*.jp*g" -o -iname "*.png" \) -exec md5sum {} >> $dateiliste \;


    Soweit ist das Problem also gelöst. ***** Vielen Dank ***** euch.


    Ich markiere das dennoch noch nicht sofort als erledigt, vielleicht findet sich, rein der Neugier wegen, ja noch Einer, der mir die Folgende Frage beantworten kann:


    Wenn ich die Variable muster (mein Suchmuster) mit \( -iname "*.jp*g" -o -iname "*.png" \) setze,

    dann meldet find: find: paths must precede expression: `\('


    Ich habe alle Permutationen von Maskierungen bei der Variablenzuweisung, die mir einfallen (mit " | ' | \" | ... | je hier oder da...) probiert, nichts hilft.

    Der gleiche Text direkt im Befehl funktioniert (also, nicht alle Permutationen haben funktioniert, aber doch einige...).


    Wenn da niemand was weiß, markiere ich den Thread etwas später als gelöst...

    Dell Latitude 7470, 4 x i7 6600U, 32 GB, 1TB NVMe

    Tumbleweed, KDE Plasma

    Für den Inhalt des Beitrages 297683 haftet ausdrücklich der jeweilige Autor: baumkraxler