peinliche Frage zum move-Befehl

Bash, Shell, PHP, Python, Perl, CGI
User avatar
coltseavers
Posts: 187
Joined: 2009-11-04 00:43
Location: NRW

peinliche Frage zum move-Befehl

Post by coltseavers » 2013-05-15 00:28

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!
Viele Grüße,
Colt Seavers

User avatar
Joe User
Project Manager
Project Manager
Posts: 11602
Joined: 2003-02-27 01:00
Location: Hamburg

Re: peinliche Frage zum move-Befehl

Post by Joe User » 2013-05-15 01:15

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.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.

User avatar
coltseavers
Posts: 187
Joined: 2009-11-04 00:43
Location: NRW

Re: peinliche Frage zum move-Befehl

Post by coltseavers » 2013-05-17 13:44

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.
Viele Grüße,
Colt Seavers

User avatar
Joe User
Project Manager
Project Manager
Posts: 11602
Joined: 2003-02-27 01:00
Location: Hamburg

Re: peinliche Frage zum move-Befehl

Post by Joe User » 2013-05-17 15:26

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.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.