staging.inyokaproject.org

find und xargs und md5sum - wie kombinieren?

Status: Ungelöst | Ubuntu-Version: Ubuntu 14.04 (Trusty Tahr)
Antworten |

res55

Avatar von res55

Anmeldungsdatum:
22. April 2009

Beiträge: 583

Hallo Allerseits ich möchte mir eine Tabelle aller Files auf meiner externen HDD anlegen: Dazu habe ich schon mal damit eine fast geeignete Liste angelegt:

find "/media/res/HDD_V/" -type f -printf '%p\t%s\t%f\t%h\n' 

So bekomme ich diese 4 Tab-getrennten Spalten: PfadundDateiname, Dateigrösse, Dateiname und Pfad

Jetzt brauche ich noch die MD5 für jede dieser Dateien, da habe ich dieses Kommando gefunden:

find "/media/res/HDD_V/" -type f -print0 | xargs -0 md5sum > "/media/res/HDD_V/checksummen.csv"

Wie kann ich beides so kombinieren, dass ich eine Datei mit 5 Spalten, einschliesslich der MD5, erlange? Danke Res

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Es gibt ein Problem, sobald im Dateinamen ungewöhnliche oder Sonderzeichen wie z.B. Zeilenwechsel vorkommen: dann gibt find ... -printf nicht mehr den korrekten Pfad- oder Dateinamen aus. Ist also im Zweifel problematisch.

Dieses Problem umgeht md5sum, indem es fast alle Sonderzeichen im Original mitnimmt, und nur "\n" als escapetes Zeichen abbildet.
Dadurch ist die Zuordnung zwar nicht kompatibel mit anderen Konventionen, aber immerhin (zusammen mit der festen Länge der Prüfsumme !) eindeutig innerhalb von md5sum .

Ich weiß ja nicht, was Du mit diesen Daten weiter vorhast, aber an solchen Vorgaben würde ich möglichst wenig herumpfuschen: sonst kommst Du ruckzuck in Teufels Küche.

Deshalb wäre mein Vorschlag:

  1. grundsätzlich die Dateinamen nicht extra abspeichern: man kann sie jederzeit aus dem Pfad ableiten, ohne Probleme

  2. Lass dem md5sum seinen Dateinamen und seine Eigenheiten: sonst gelingt die Prüfung anhand der Summen hinterher nicht mehr.
    Also: setz einfach die Dateilänge selber davor, mit dem TAB getrennt, wie Du es vorhattest:

    1
    find  /media/res/HDD_V/  -type f -printf '%s\t' -exec md5sum {} \;
    

    Dieser Vorspann ist leicht abzutrennen, und dann hat md5sum wieder sein Milieu.

Was Du jetzt separat regeln müsstest, wäre die externe Nutzung des md5sum- Datei- und Pfadnamens. Dazu müsstest Du Dir natürlich einen Filter bauen.

LG,

track

res55

(Themenstarter)
Avatar von res55

Anmeldungsdatum:
22. April 2009

Beiträge: 583

Danke track dass Du Dich damit befasst. Jedoch kommt bei diesem Befehl die Meldung nach jeder Zeile mit Daten:

md5sum: : Datei oder Verzeichnis nicht gefunden

vermutlich, weil gar kein Dateiname übergeben wurde. auch in dieser korrigierten Version schaut es ähnlich aus:

find  "/media/res/HDD_V/"  -type f -printf '%p\t%s\n' -exec md5sum {} \;

ergibt viele Zeilen der Art:

/media/res/HDD_V/axioms.htm	19519
md5sum: : Datei oder Verzeichnis nicht gefunden

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

res55 schrieb:

find  "/media/res/HDD_V/"  -type f -printf '%p\t%s\n' -exec md5sum {} \;

Ist das Absicht, dass Du zwischen der Länge und der md5sum einen Zeilenwechsel einfügst ? - Du weißt, dass Du dann pro Datei 2 Zeilen bekommst !

ergibt viele Zeilen der Art:

/media/res/HDD_V/axioms.htm	19519
md5sum: : Datei oder Verzeichnis nicht gefunden

Kann ich nicht nachvollziehen, woher das kommen könnte. Denn selbst bei meiner Giftsuite tritt solch ein Fehler nicht auf:

track@track:~$ find  ./-test/  -type f -printf '%p\t%s\n' -exec md5sum {} \; > /dev/null
track@track:~$ find  ./-test/  -type f -printf '%p\t%s\n' -exec md5sum {} \;
./-test/AVSEQ01.DAT	6
8feb211fef744a43469cf07400094c70  ./-test/AVSEQ01.DAT
./-test/AVSEQ01.DAT.BAK	5
d8e8fca2dc0f896fd7cb4cb0031ba249  ./-test/AVSEQ01.DAT.BAK
./-test/ich bin?böse	2
\6d7fce9fee471194aa8b5b6e47267f03  ./-test/ich bin\nböse
./-test/or'd"ner/AVSEQ01.DAT	6
8feb211fef744a43469cf07400094c70  ./-test/or'd"ner/AVSEQ01.DAT
./-test/or'd"ner/AVSEQ01.DAT.BAK	5
d8e8fca2dc0f896fd7cb4cb0031ba249  ./-test/or'd"ner/AVSEQ01.DAT.BAK
./-test/or'd"ner/or'd"ner/AVSEQ01.DAT	6
8feb211fef744a43469cf07400094c70  ./-test/or'd"ner/or'd"ner/AVSEQ01.DAT
./-test/or'd"ner/or'd"ner/AVSEQ01.DAT.BAK	5
d8e8fca2dc0f896fd7cb4cb0031ba249  ./-test/or'd"ner/or'd"ner/AVSEQ01.DAT.BAK
./-test/ord  ner/.ja ja	0
d41d8cd98f00b204e9800998ecf8427e  ./-test/ord  ner/.ja ja
./-test/das hier ist gemein: \n ... kein echtes newline	2
\9ae0ea9e3c9c6e1b9b6252c8395efdc1  ./-test/das hier ist gemein: \\n ... kein echtes newline
./-test/gnu    > *	2
1dcca23355272056f04fe8bf20edfce0  ./-test/gnu    > *
./-test/achdu?schreck!	2
48a24b70a0b376535542b996af517398  ./-test/achduschreck!     # Ja: selbst das [ESC] ist hier zwar unsichtbar, aber korrekt im Dateinamen drin.
./-test/-n	7
c126dc86c0b93104b1b44727e29f8f56  ./-test/-n
./-test/--giftvogel/vogeltest	0
d41d8cd98f00b204e9800998ecf8427e  ./-test/--giftvogel/vogeltest
./-test/  vorn 2 leer	0
d41d8cd98f00b204e9800998ecf8427e  ./-test/  vorn 2 leer
./-test/test  datei?mit Gift ('Kopie").txt	6
\8fbedfb8c767e58600b08267120605a9  ./-test/test  datei\nmit Gift ('Kopie").txt 

Gleichzeitig siehst Du diverse Zeichen, die er mit -printf "%p" nicht darstellt: damit verlierst Du also ganz sicher bestimmte Dateinamen.

Du müsstest Genaueres sehen, wenn Du vorher mal set -x ausführst. So finde ich jedenfalls keinen Anhaltspunkt.

LG,

track

res55

(Themenstarter)
Avatar von res55

Anmeldungsdatum:
22. April 2009

Beiträge: 583

Ist das Absicht, dass Du zwischen der Länge und der md5sum einen Zeilenwechsel einfügst ?

Nein. Sollte nicht sein.

Gleichzeitig siehst Du diverse Zeichen, die er mit -printf "%p" nicht darstellt: damit verlierst Du also ganz sicher bestimmte Dateinamen.

wie lässt sich das vermeiden?

Du müsstest Genaueres sehen, wenn Du vorher mal set -x ausführst. (So finde ich jedenfalls keinen Anhaltspunkt.)

set -x 
CLUTTER_IM_MODULE xim
COLORTERM gnome-terminal
COLUMNS 174
COMPIZ_BIN_PATH /usr/bin/
COMPIZ_CONFIG_PROFILE ubuntu
DBUS_SESSION_BUS_ADDRESS 'unix'  'abstract=/tmp/dbus-VHku9XzPOu'
DEFAULTS_PATH /usr/share/gconf/ubuntu.default.path
DESKTOP_SESSION ubuntu
DISPLAY ''  '0'
GDMSESSION ubuntu
GDM_LANG de_DE
GNOME_DESKTOP_SESSION_ID this-is-deprecated
GNOME_KEYRING_CONTROL /run/user/1000/keyring-bLOEPb
GNOME_KEYRING_PID 2735
GPG_AGENT_INFO '/run/user/1000/keyring-bLOEPb/gpg'  '0'  '1'
GTK_IM_MODULE ibus
GTK_MODULES 'overlay-scrollbar'  'unity-gtk-module'
HOME /home/res
IM_CONFIG_PHASE 1
INSTANCE ''
JOB dbus
LANG de_DE.UTF-8
LANGUAGE 'de_DE'  'de_CH'  'en_US'  'en_AU'  'en'
LC_ADDRESS de_CH.UTF-8
LC_IDENTIFICATION de_CH.UTF-8
LC_MEASUREMENT de_CH.UTF-8
LC_MONETARY de_CH.UTF-8
LC_NAME de_CH.UTF-8
LC_NUMERIC de_CH.UTF-8
LC_PAPER de_CH.UTF-8
LC_TELEPHONE de_CH.UTF-8
LC_TIME de_CH.UTF-8
LINES 174
LOGNAME res
MANDATORY_PATH /usr/share/gconf/ubuntu.mandatory.path
PAPERSIZE a4
PATH '/usr/local/sbin'  '/usr/local/bin'  '/usr/sbin'  '/usr/bin'  '/sbin'  '/bin'…
PWD /home/res
QT4_IM_MODULE xim
QT_IM_MODULE ibus
QT_QPA_PLATFORMTHEME appmenu-qt5
SELINUX_INIT YES
SESSION ubuntu
SESSIONTYPE gnome-session
SESSION_MANAGER 'local/res-Z68MA-D2H-B3'  '@/tmp/.ICE-unix/2959,unix/res-Z68MA-D'…
SHELL /usr/bin/fish
SHLVL 1
SSH_AUTH_SOCK /run/user/1000/keyring-bLOEPb/ssh
TERM xterm
TEXTDOMAIN im-config
TEXTDOMAINDIR /usr/share/locale/
UPSTART_SESSION 'unix'  'abstract=/com/ubuntu/upstart-session/1000/2776'
USER res
VTE_VERSION 3409
WINDOWID 71303179
XAUTHORITY /home/res/.Xauthority
XDG_CONFIG_DIRS '/etc/xdg/xdg-ubuntu'  '/usr/share/upstart/xdg'  '/etc/xdg'
XDG_CURRENT_DESKTOP Unity
XDG_DATA_DIRS '/usr/share/ubuntu'  '/usr/share/gnome'  '/usr/local/share/'  '/usr/share/'
XDG_GREETER_DATA_DIR /var/lib/lightdm-data/res
XDG_MENU_PREFIX gnome-
XDG_RUNTIME_DIR /run/user/1000
XDG_SEAT seat0
XDG_SEAT_PATH /org/freedesktop/DisplayManager/Seat0
XDG_SESSION_ID c2
XDG_SESSION_PATH /org/freedesktop/DisplayManager/Session0
XDG_VTNR 7
XMODIFIERS @im=ibus
__fish_bin_dir /usr/bin
__fish_datadir /usr/share/fish
__fish_help_dir /usr/share/doc/fish
__fish_sysconfdir /etc/fish

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Ich bin verwirrt.
- Was ist das für eine komische Shell (diese "Fish Shell" ...), die auf den Befehl set -x hin sowas wie das Environment ausgibt, anstatt den Debug-Modus einzuschalten ?

Klar, dass dann sämtliche Vor- und Ratschläge von uns erstmal für die Katz sind, wenn Du eine ganz andere (Sonder-)Shell verwendest.
Wie gesagt: es wäre nett, wenn Du uns sowas vorher verrätst, denn ich (und die meisten anderen hier auch) probieren die Befehle natürlich unter der Standard-Bash aus. In dem Fall müsstest Du wahrscheinlich die Befehle für diese Shell anpassen, falls sie dort überhaupt so funktionieren.

Auf jeden Fall musst Du Dir die betreffenden Kapitel des Manuals Deiner Shell durchlesen, damit Du überhaupt weißt, wie alles unter dieser Shell funktionieren soll. (Ob es dazu noch Bugs gibt, erfordert nochmal weitere Recherche.)

res55 schrieb:

Gleichzeitig siehst Du diverse Zeichen, die er mit -printf "%p" nicht darstellt: damit verlierst Du also ganz sicher bestimmte Dateinamen.

wie lässt sich das vermeiden?

Gar nicht. Denn find ... -printf ist einfach so gebaut wie es ist, und kann solche Zeichen nicht. (→ im Zweifel siehe man find !)
Einen Weg, das Problem zu vermeiden hatte ich Dir oben ja bereits empfohlen ... 🐸

LG,

track

frostschutz

Avatar von frostschutz

Anmeldungsdatum:
18. November 2010

Beiträge: 7795

Falls Python als Alternative in Frage kommt, dieses (grauenhafte 😀) Script habe ich früher benutzt um meine selbstgebrannten CDs zu katalogisieren: http://termbin.com/1h8t

res55

(Themenstarter)
Avatar von res55

Anmeldungsdatum:
22. April 2009

Beiträge: 583

track schrieb:

Ich bin verwirrt.
- Was ist das für eine komische Shell (diese "Fish Shell" ...), die auf den Befehl set -x hin sowas wie das Environment ausgibt, anstatt den Debug-Modus einzuschalten ?

Klar, dass dann sämtliche Vor- und Ratschläge von uns erstmal für die Katz sind, wenn Du eine ganz andere (Sonder-)Shell verwendest.
Wie gesagt: es wäre nett, wenn Du uns sowas vorher verrätst, denn ich (und die meisten anderen hier auch) probieren die Befehle natürlich unter der Standard-Bash aus. In dem Fall müsstest Du wahrscheinlich die Befehle für diese Shell anpassen, falls sie dort überhaupt so funktionieren.

Danke, das löst diesen Fall. Ich war mir nicht bewusst, dass die Kommandos bei verschiedenen Shells unterschiedlich funktionieren. Sorry. Mit der Bash funktioniert Dein Vorschlag.

Danke. Gelöst. Gruss Res

Antworten |