Manchmal möchte man sich ob absurder Phänomene mit der eigenen Hand fest vor den eigenen Schädel schlagen. Diesmal haben wir nicht schlecht gestaunt, als wir das Folgende beobachteten:

Unter Linux kopiert man alle Dateien eines Verzeichnisses (das “*” ist ein Linux-typischer Platzhalter für “alles was im aktuellen Verzeichnis ist”) inklusive der Unterverzeichnisse mit dem Befehl

cp -a * ZIELVERZEICHNIS

“Zielverzeichnis” wird natürlich durch den Namen des Zielverzeichnisses ersetzt. Wir staunten auf den ersten – und zugegeben auch auf den zweiten Blick – nicht schlecht, als wir feststellten, dass eben nicht die Dateien alle kopiert worden, sondern nur sogenannte “Hardlinks” angelegt worden waren. Hardlinks sind so etwas Ähnliches wie Verknüpfungen, auf die selbe Stelle im System zeigen mehrere Dateienamen, diese Stelle ist also mit mehreren Dateienamen “hard verlinkt”.

Was war geschehen? Haben Sie eine Idee?

 

 

 

Hier arbeitete das System völlig korrekt – wir hatten eine Besonderheit übersehen: Im Verzeichnis lag auch eine Datei mit dem Namen

-la

Da das “*” ja zu allen Dateinamen im Verzeichnis aufgelöst wird, wurde aus dem “*” ein

-la name1 name2 name3 name4 ...

Und damit wurde aus dem Gesamtbefehl ein

cp -a -la name1 name2 name3 name4 ZIELVERZEICHNIS

“Böse Falle” könnte man sagen, der Dateiname “-la” wird damit vom Kopierbefehl nicht als Dateiname, sondern als Parameter interpretiert und der Parameter “l” bedeutet eben “erzeuge Hardlinks anstatt zu kopieren”.

Und wie kann das umgangen werden?

Wenn man weiß, dass Dateien mit einem “Minus-Zeichen” am Anfang eines Dateinamens vorhanden sind, kann man den Parameter “–” als letzten “echten Parameter” verwenden, also

cp -a -- * ZIELVERZEICHNIS

eingeben. Das System beendet dann die Parameterinterpretation bei dem “–“-Parameter.

Dieser “–“-Parameter steht übrigens nicht in der Anleitung, der “man-Page” des cp-Befehls, er ist jedoch in der man-Page des rm-Befehls zu finden und klappt auch bei “cp”.