[linux-l] Finger weg vom Konqueror als Dateimanager

Mike Dornberger Mike.Dornberger at gmx.de
Fr Feb 24 17:46:45 CET 2006


Hi,

On Fri, Feb 24, 2006 at 10:23:00AM +0100, Boris Kirkorowicz wrote:
> was ist bspw. "M-s"?

M steht für Meta. Häufig kannst du dafür die Alt-Taste benutzen, aber nicht
immer, manchmal auch Shift-Alt (z. B. Debian, Emacs: M-x -> Shift-Alt-x).
Was immer gehen sollte, ist einmal Esc zu drücken, loslassen und dann den
Buchstaben, hier also s.

> 2. ich möchte öfter mal Verzeichnisbäume grob vergleichen. Dazu genügt
> mir oft ein Vergleich der Zahl der enthaltenen Dateien und deren
> Gesamtgröße. Wenn ich im mc jedoch ein Verzeichnis markiere, werden
> dessen Dateien und Unterordner nicht berücksichtigt. Da ich dafür keine
> einstellbare Option gefunden habe, möchte ich gerne wissen, wie man das
> -im mc oder Kommandozeile- bewerkstelligen kann.

Naja, das geht bestimmt auch irgendwie graphisch... Hier mal eine
Shell-Methode:

find DIR1/ -type f >dirlisting1
find DIR2/ -type f >dirlisting2

-type f, wenn du nur wirkliche Dateien zählen willst, keine Verzeichnisse,
FIFOs, Devices, Symlinks, ...

wc dirlisting 1 dirlisting 2

oder halt

find DIR1/ -type f | wc
find DIR2/ -type f | wc

Achtung, unter Linux können Datei- und Verzeichnisnamen auch z. B. Linefeed
("Enter-/Return-Zeichen", Zeilenumbruch) enthalten. Dann zählt dir das wc
natürlich jeweils eine Zeile zuviel. Wenn die Verzeichnisse aber die selben
Dateinamen beinhalten, sollte der Fehler auf beiden Seiten gleich sein.

danach

du --apparent-size -sch DIR1
du --apparent-size -sch DIR2

> 2a. Wie kann ich zwei Verzeichnisbäume vollständig (also jede enthaltene
> Datei binär) vergleichen? Bisher hatte ich dafür REXX bemüht...

Z. B. mittels

cd DIR1;
find -type f -exec cmp "{}" "/path/to/DIR2/{}" \; 2>&1 | less -S

Hier ist das -type f wichtig, da alles andere nicht unbedingt Sinn macht, es
inhaltlich vergleichen zu wollen, Probleme gibt oder überhaupt nicht möglich
ist oder ...

Dies macht folgendes:

find sucht im aktuellen Verzeichnis (= DIR1, wegen cd, wichtig!) alle
Dateien und führt für jede das externe Programm cmp aus (was im wesentlichen
Dateien vergleicht ;) ) und übergibt ihm zwei Parameter:

{} expandiert zum gefundenen Objekt mit Pfadangabe, die {} mußt du aber vor
der Shell quoten, deshalb die Anführungszeichen. find setzt vor den Pfad das
Verzeichnis, von dem aus gesucht werden sollte (oder "." = aktuelles
Verzeichnis, wenn keins angegeben wurde vor den find-Optionen, wie hier im
Beispiel).

Also z. B. für eine Datei Namens

foo/bar

unterhalb von DIR1 expandiert zu "{}" zu "./foo/bar".

Das wird jetzt im 2. Argument zu cmp dahingehend ausgenutzt, daß Du den
absoluten Pfad zu DIR2 angibst, also z. B. /home/user/DIR2. Achte auf das
führende "/"! Das zweite Argument expandiert also zu
/home/user/DIR2/./foo/bar. Das ist äquivalent zu /home/user/DIR2/foo/bar, da
der . als Verzeichnisname in diesem Fall nicht das aktuelle
Arbeitsverzeichnis (DIR1), sondern eben DIR2 referenziert.

Mittels ; teilst Du find mit, daß hier die Liste der Argumente für das
externe Programm zu Ende ist. ; muß wieder vor der Shell gequotet werden.
Man hätte auch ";" oder ';' schreiben können. Die Umleitung 2>&1 muß noch
eingebaut werden, da cmp auf stderr ausgibt, wenn es die zweite Datei nicht
gefunden hat. Wenn die Dateien sich unterscheiden, gibt es das eh auf stdout
aus. cmp gibt nichts aus, wenn sich die Dateien nicht unterscheiden.

Wenn du noch den Fall abtesten willst, ob in DIR2 Dateien sind, die in DIR1
nicht sind, mußt du anschließend noch ein

cd DIR2;
find -type f -not -exec test -e "/path/to/DIR1/{}" \; -printf "%p existiert nicht
unter DIR1"

machen oder einfach nur

find -type f -not -exec test -e "/path/to/DIR1/{}" \; -print

für eine Auflistung.

Nun, mit dem einen oder anderen Dateimanager geht das bestimmt einfacher,
wie z. B. mit Total Commanders (Windows) "Verzeichnisse synchronisieren...",
aber da weiß ich jetzt wie gesagt nichts.

Gruß,
 Mike



Mehr Informationen über die Mailingliste linux-l