Der gesuchte Befehl ist
mv * .[^.]* ..
oder (weitere Informationen siehe unten):
(shopt -s dotglob; mv -- * ..)
Erklärung:der mv
Befehl verschiebt Dateien und Verzeichnisse. Das letzte Argument für mv
ist das Ziel (in diesem Fall das Verzeichnis eine Stufe "oben" 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 (dotfiles), sind „versteckt“. Sie werden nach dem Muster .[^.]*
abgeglichen (siehe Bearbeitung unten).
Weitere Informationen zu mv
finden Sie auf der von mir verlinkten Manpage .
Warum .[^.]*
statt .*
?
Wie Chris Johnsen richtig betont:das Muster .*
passt auch zu .
und ..
. Da Sie diese nicht verschieben wollen (und können), ist es besser, ein Muster zu verwenden, das mit jedem Dateinamen übereinstimmt, der mit einem Punkt beginnt außer diesen beiden . Das Muster .[^.]*
tut genau das:es passt auf jeden Dateinamen (1), der mit einem Punkt (2) beginnt, gefolgt von einem Zeichen, das nicht ist ein Punkt (3) gefolgt von null oder mehr beliebigen Zeichen.
Wie Paggas betont, müssten wir auch das Muster .??*
hinzufügen um Dateien abzugleichen, die mit zwei Punkten beginnen. Siehe seine Antwort für eine alternative Lösung mit find
.
Arjans Antwort erwähnt shopt
um all diese Probleme mit dotfiles 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 so zu verwenden:
(shopt -s dotglob; mv -- * ..)
Dies führt shopt
aus in einer Subshell (also kein zweiter Aufruf von shopt
erforderlich) und verwendet --
damit Dateien, die mit einem Bindestrich beginnen, nicht als Argumente für mv
interpretiert werden .
Kurze Antwort:Verwenden Sie
find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
Lange Antwort:
Der Befehl
mv * .* ..
funktioniert nicht seit .*
kann mit .
übereinstimmen und ..
. Aber der Befehl
mv * .[^.]* ..
wird auch nicht funktionieren, da .[^.]*
passt nicht, z. B. ..filename
! Was ich stattdessen tue, ist
mv * .[^.] .??* ..
was mit allem übereinstimmt außer .
und ..
. *
findet alles, was nicht mit .
beginnt , .[^.]
stimmt mit allen 2-stelligen Dateinamen überein, die mit einem Punkt beginnen, außer ..
, und .??*
stimmt mit allen Dateinamen überein, die mit einem Punkt mit mindestens 3 Zeichen beginnen.
Besser noch, Sie können
verwendenfind . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +
was die hässlichen Glob-Hacks in mv * .[^.] .??* ..
vermeidet !
Nur der Vollständigkeit halber kann man der Bash-Shell auch mit shopt
mitteilen, versteckte Dateien einzubinden :
shopt -s dotglob
mv -- * ..
shopt -u dotglob