Page 1 of 1

peinliche Frage zum move-Befehl

Posted: 2013-05-15 00:28
by coltseavers
Hallo zusammen,

es ist mir sehr peinlich, aber ich habs grad nur über Umwege geschafft, da ich den move-Befehl nicht richtig benutzen konnte:

In einem Verzeichnis /V/u1/u2/ habe ich mehrere Dateien und Unterverzeichnisse liegen.
Diese sollen eine Ebene höher verschoben werden - also nach /V/u1/.

Meine Idee war:

Code: Select all

mv /V/u1/u2/ /V/u1/
Wahrscheinlich werden jetzt fast alle Leser lachen. Alle, die nicht lachen: dieser Befehl geht schief, weil dann versucht wird das Verzeichnis u2 (samt Dateien und Unterverzeichnissen) nach /V/u1 zu verschieben - genau dort liegt es aber schon.
Ich möchte aber nicht das Verzeichnis u2 verschieben, sondern nur dessen Inhalt.
Aus /V/u1/u2/index.htm soll also /V/u1/index.htm werden.

Wie um alles in der Welt macht man das???? Ich dreh fast durch hier!

Ach ja:

Code: Select all

mv /V/u1/u2/*.* /V/u1/
geht auch schief, weil dann nur die Dateien, nicht aber die Unterzeichnisse verschoben werden.

Ich hab das Problem nun anderweitig gelöst, aber dennoch würd ich gern diesen Wissensschandfleck aus meinem Hirn eliminieren.
Vielen Dank vorab!

Re: peinliche Frage zum move-Befehl

Posted: 2013-05-15 01:15
by Joe User
Du warst schon auf einem guten Weg. Hier eine vollständige Lösung für die meisten Shells:

Code: Select all

\mv -- /V/u1/u2/* /V/u1/u2/.[^.] /V/u1/u2/.??* /V/u1/
Kurze Erklärung:
\ unterbindet etwaige Nebenwirkungen von definierten Aliasen für mv.
-- verhindert dass Dateien/Verzeichnisse die mit einem Minus beginnen als Commadline-Option iterpretiert werden.
* erfasst alle Dateien/Verzeichnisse, die nicht mit einem Punkt beginnen.
.[^.] erfasst alle Dateien/Verzeichnisse, die mit einem Punkt beginnen und ein weiteres Zeichen lang sind.
.??* erfasst alle Dateien/Verzeichnisse, die mit einem Punkt beginnen und zwei oder mehr weitere Zeichen lang sind.

Nicht einfach zu verstehen und zu erklären, daher verweise ich die interessierten Leser nur auf die Doku ihrer Shell.

Re: peinliche Frage zum move-Befehl

Posted: 2013-05-17 13:44
by coltseavers
Servus Joe,

vielen Dank für die ausführliche Antwort. Bis auf den Backslash zu Beginn hab ich sogar alles verstanden! :-)

Mein Fehler lag zu dieser späten Stunde einfach in meinem mitgeschleppten Erbe aus MS-DOS-Zeiten...
*.* (steht für alle Dateien eines Verzeichnisses) - das waren noch Zeiten.

Die Lösung für die Verschiebung aller Dateien und Unterverzeichnisse um eine Ebene höher (das war ja das, worum es mir ging) sieht natürlich einfacher aus:

Code: Select all

mv -- /V/u1/u2/* /V/u1/
Wer sich nun vielleicht noch fragt, warum an die eine Stelle ein * kommt, und an die andere Stelle nicht:
* sagt in diesem Fall: nimm den Inhalt von u2 (und nicht etwa u2 selbst), und packe ihn in u1.
Lässt man den * weg, hat man das Problem, dass versucht wird das Verzeichnis selbst zu verschieben und nicht nur dessen Inhalt.
Man näme also u2 aus u1 heraus und würde es aber wieder genau an die gleiche Stelle pflanzen, was mv auch bemerkt und entsprechend mit dem Fehler erklärt: Quelle und Ziel sind identisch.

Warum nun allerdings beim Ziel am Ende kein * stehen darf, verstehe ich noch nicht so ganz (denn dann versucht er wieder u2 mitzuverschieben), aber damit kann ich momentan leben.

Re: peinliche Frage zum move-Befehl

Posted: 2013-05-17 15:26
by Joe User
coltseavers wrote:Die Lösung für die Verschiebung aller Dateien und Unterverzeichnisse um eine Ebene höher (das war ja das, worum es mir ging) sieht natürlich einfacher aus:

Code: Select all

mv -- /V/u1/u2/* /V/u1/
Damit erwischt Du aber keine Dateien/Verzeichnisse die mit einem Punkt beginnen, wie zum Beispiel ".htaccess" oder ".svn" ;)
coltseavers wrote:Warum nun allerdings beim Ziel am Ende kein * stehen darf, verstehe ich noch nicht so ganz (denn dann versucht er wieder u2 mitzuverschieben), aber damit kann ich momentan leben.
Weil das letzte Argument immer das Ziel ist. Das wird Dir spätestens klar, wenn Du mal eine Datei verschiebst und gleichzeitig umbenennst:

Code: Select all

mv /path/to/old.txt /path/to/new.txt
Wenn nun ein * als Ziel angegeben würde, würde die Datei dann * statt new.txt heissen.
Und wenn man zusätzlich bedenkt, dass mv das Ziel ersetzt wenn es bereits existiert, dann wirds erst richtig heikel.