Der gesuchte Befehl ist
mv * .[^.]* ..
oder (siehe unten für weitere Informationen):
(shopt -s dotglob; mv -- * ..)
Erklärung: Der Befehl mv
verschiebt Dateien und Verzeichnisse. Das letzte Argument von mv
ist das Ziel (in diesem Fall das Verzeichnis eine Stufe “höher” im Baum, ..
). Die Argumente davor sind die Quelldateien und -verzeichnisse. Das Sternchen (*
) ist ein Platzhalter, der auf alle Dateien passt, die nicht mit einem Punkt beginnen. Dateien, die mit einem Punkt beginnen (Punktdateien), sind “versteckt”. Sie werden mit dem Muster .[^.]*
abgeglichen (siehe Bearbeitung unten).
Siehe die Manpage, die ich verlinkt habe, für weitere Informationen zu mv
.
Warum .[^.]*
anstelle von .*
?
Wie Chris Johnsen richtig feststellt: das Muster .*
passt auch auf .
und ..
. Da Sie diese nicht verschieben wollen (und können), ist es besser, ein Muster zu verwenden, das auf jeden Dateinamen passt, der mit einem Punkt beginnt außer diesen beiden. Das Muster .[^.]*
tut genau das: Es passt auf jeden Dateinamen (1), der mit einem Punkt beginnt (2), gefolgt von einem Zeichen, das kein Punkt ist (3), gefolgt von null oder mehr beliebigen Zeichen.
Wie Paggas anmerkt , müssten wir auch das Muster .??*
hinzufügen, um Dateien zu finden, die mit zwei Punkten beginnen. Siehe seine Antwort für eine alternative Lösung mit find
.
In Arjans Antwort wird shopt
erwähnt, um all diese Probleme mit Punktdateien zu vermeiden. Aber dann gibt es immer noch das Problem mit Dateien, die mit einem Bindestrich beginnen. Und es erfordert drei Befehle. Trotzdem gefällt mir die Idee. Ich schlage vor, es wie folgt zu verwenden:
(shopt -s dotglob; mv -- * ..)
Dies führt shopt
in einer Subshell aus (also kein zweiter Aufruf von shopt
erforderlich) und verwendet --
, damit Dateien, die mit einem Bindestrich beginnen, nicht als Argumente für mv
interpretiert werden.