bk99.de entertain the web since 1997

Sechs Linux-Einzeiler von 2007 und was man heute stattdessen tippt

Zusammenfassung

Anfang 2007 habe ich auf bk99.de eine kleine Liste mit Einzeilern gepflegt, „alles was normale Menschen so tagtäglich brauchen“: doppelte Dateien finden, über ssh Dateien bearbeiten, Plattenabbilder komprimiert übers Netz schicken und defekte Platten retten. Drei davon funktionieren bis heute, zwei hatten Fehler, und einer geht mit dem heutigen Standardwerkzeug so nicht mehr. Dieser Beitrag aus meinem alten Blog zeigt die Liste, was jede Zeile tut und wie man sie heute schreibt.

Die Liste von 2007

Die Seite hieß „Linux Quickies“ und war eine Tabelle mit Befehl und Beschreibung. So stand sie im Februar 2007 im Netz:

find . -exec md5sum {} 2>/dev/null \; | sort | uniq -w 32 -D     Doppelte Dateinamen finden
ssh -t root@tyr 'vi /etc/passwd'                                ssh mit -t Pseudo Terminal
buffer ssh | bzip2 | buffer | ssh "cat > image.bz2"
rsync | ssh                                                     rsync oder ssh with -C
dd_rescue -r /dev/hdb /dev/stdout | ssh root@bla "cat > image"  Von hinten nach stdout und dann per ssh
dd_rescue /dev/sda1 - | ssh username@machineip ‘cat /datarecovery/backup.img’

Doppelte Dateien finden

Die erste Zeile berechnet für jede Datei die MD5-Prüfsumme, sortiert die Liste und lässt uniq nur die Zeilen ausgeben, deren erste 32 Zeichen, also die Prüfsumme, mehrfach vorkommen. Sie findet damit Dateien mit gleichem Inhalt, nicht gleiche Dateinamen, wie die Beschreibung sagt. Ausprobiert funktioniert sie bis heute.

Zwei Verbesserungen machen sie schneller und sauberer: -type f lässt Verzeichnisse aus, die md5sum nur mit Fehlermeldungen quittiert, und {} + übergibt viele Dateien auf einmal statt für jede ein eigenes md5sum zu starten.

find . -type f -exec md5sum {} + | sort | uniq -w 32 -D

Für große Bestände gibt es eigene Werkzeuge, alle in Debian enthalten: fdupes -r vergleicht erst Größen und dann Inhalte, rdfind und jdupes ersetzen Dubletten auf Wunsch durch harte Links. Das ist schneller, weil Dateien mit einmaliger Größe gar nicht erst gelesen werden.

Ein Terminal für den Befehl auf der anderen Seite

ssh mit einem Befehl am Ende führt diesen ohne Terminal aus. Für ls oder df reicht das, ein Editor wie vi braucht aber ein Terminal, sonst bleibt der Bildschirm leer oder die Tasten kommen falsch an. -t fordert auf der Gegenseite ein Pseudo-Terminal an.

ssh -t root@tyr 'vi /etc/passwd'

Für genau diese Datei würde ich heute vipw nehmen. Es sperrt die Datei während der Bearbeitung und prüft danach auf Fehler, statt eine kaputte passwd zu speichern: ssh -t admin@tyr sudo vipw.

Abbilder komprimiert übers Netz

Die dritte Zeile ist eher eine Gedächtnisstütze als ein Befehl: Daten erzeugen, puffern, mit bzip2 packen, wieder puffern und über ssh in eine Datei auf dem anderen Rechner schreiben. Das Programm buffer glättete dabei die Sprünge zwischen schneller Platte, langsamem Packer und Netz. Die vierte Zeile meinte, dass rsync über ssh läuft und dass ssh -C oder rsync -z die Daten unterwegs komprimieren.

Heute ersetzt zstd das bzip2: Es ist um ein Vielfaches schneller, nutzt mit -T0 alle Kerne, und pv zeigt Fortschritt und Durchsatz an. Die Puffer-Rolle übernimmt bei Bedarf mbuffer.

dd if=/dev/sdX bs=4M | pv | zstd -T0 | ssh backup@ziel 'cat > /backup/sdX.img.zst'
rsync -az --info=progress2 quelle/ backup@ziel:/backup/quelle/

Defekte Platten retten

Die letzten beiden Zeilen nutzen dd_rescue von Kurt Garloff. Anders als dd bricht es bei Lesefehlern nicht ab, sondern überspringt sie, und mit -r liest es die Platte von hinten nach vorn. Das hilft, wenn ein beschädigter Bereich am Anfang den Lesekopf aufhält. Die Ausgabe ging an die Standardausgabe und über ssh auf einen anderen Rechner, damit auf der kranken Platte nichts geschrieben wird.

Die letzte Zeile hätte so nie funktioniert, aus zwei Gründen: Statt gerader Hochkommas stehen typografische Anführungszeichen, die die Shell nicht als Quoting erkennt. Und cat liest die Datei aus, statt zu schreiben; gemeint war cat > /datarecovery/backup.img.

Debian enthält dd_rescue nicht mehr, das Paket gab es zuletzt in Debian 6. Üblich ist heute GNU ddrescue aus dem Paket gddrescue. Es führt eine Mapdatei, in der steht, welche Bereiche schon gelesen sind, kann mit -R ebenfalls rückwärts lesen und einen Lauf jederzeit fortsetzen. Den Weg über die Standardausgabe kennt es aber nicht, denn es braucht eine Ausgabedatei, in der es hin und her springen kann. Das Abbild entsteht deshalb auf einer gesunden Platte oder einem eingehängten Netzlaufwerk, komprimiert wird hinterher.

ddrescue -d -n /dev/sdX /mnt/rettung/sdX.img /mnt/rettung/sdX.map
ddrescue -d -r3 /dev/sdX /mnt/rettung/sdX.img /mnt/rettung/sdX.map

Der erste Lauf holt mit -n schnell alles, was sich ohne Mühe lesen lässt, der zweite versucht die schwierigen Stellen bis zu dreimal. -d liest direkt von der Platte am Cache vorbei.

Zahlen im Überblick

  • Die Notiz „Linux Quickies“ stand im alten Plone-Blog unter /dokumente/linux-quickys; die archivierte Fassung trägt das Datum 3. Februar 2007.
  • uniq -w 32 vergleicht nur die ersten 32 Zeichen einer Zeile, das ist genau die Länge einer MD5-Prüfsumme in Hexadezimalschreibweise.
  • GNU ddrescue braucht laut Handbuch Ein- und Ausgabedateien mit wahlfreiem Zugriff und schreibt daher nicht in eine Pipe.
  • In Debian 13 heißt das Paket für GNU ddrescue gddrescue; dd_rescue gab es zuletzt in Debian 6.

Referenzen

Bemerkungen

  • Ich habe die Tabelle 2026 wörtlich aus dem Webarchiv übernommen, nur als Textblock statt als Tabelle; spätere Ergänzungen bis 2009 sind dort nicht erhalten.
  • tyr aus der zweiten Zeile war einer meiner damaligen Rechner, wie odin und Hödur benannt nach Göttern der nordischen Mythologie.

Originalnotiz im Webarchiv