Wie verschiebe ich alle Dateien in einem Verzeichnis (einschließlich der versteckten) in ein anderes Verzeichnis?
Wenn ich zum Beispiel einen Ordner „Foo“ mit den Dateien „.hidden“ und „notHidden“ darin habe, wie verschiebe ich dann beide Dateien in ein Verzeichnis namens „Bar“? Folgendes funktioniert nicht, da die „.hidden“-Datei in „Foo“ bleibt.
mv Foo/* Bar/
Probieren Sie es selbst aus.
mkdir Foo
mkdir Bar
touch Foo/.hidden
touch Foo/notHidden
mv Foo/* Bar/
Akzeptierte Antwort:
Schsch
mv Foo/*(DN) Bar/
oder
setopt -s glob_dots
mv Foo/*(N) Bar/
(Lassen Sie das (N)
weg wenn Sie wissen, dass das Verzeichnis nicht leer ist.)
Bash
shopt -s dotglob nullglob
mv Foo/* Bar/
Ksh93
Wenn Sie wissen, dass das Verzeichnis nicht leer ist:
FIGNORE='.?(.)'
mv Foo/* Bar/
Standard (POSIX) sh
for x in Foo/* Foo/.[!.]* Foo/..?*; do
if [ -e "$x" ]; then mv -- "$x" Bar/; fi
done
Wenn Sie bereit sind, den mv
Befehl einen Fehlerstatus zurückgibt, obwohl er erfolgreich war, ist es viel einfacher:
mv Foo/* Foo/.[!.]* Foo/..?* Bar/
GNU find und GNU mv
find Foo/ -mindepth 1 -maxdepth 1 -exec mv -t Bar/ -- {} +
Standardsuche
Wenn es Ihnen nichts ausmacht, in das Quellverzeichnis zu wechseln:
cd Foo/ &&
find . -name . -o -exec sh -c 'mv -- "[email protected]" "$0"' ../Bar/ {} + -type d -prune
Hier finden Sie weitere Einzelheiten zur Steuerung, ob Punktdateien in bash, ksh93 und zsh abgeglichen werden.
Bash
Setzen Sie den dotglob
Option.
$ echo *
none zero
$ shopt -s dotglob
$ echo *
..two .one none zero
Es gibt auch das flexiblere GLOBIGNORE
-Variable, die Sie auf eine durch Doppelpunkte getrennte Liste von zu ignorierenden Platzhaltermustern setzen können. Wenn nicht gesetzt (Standardeinstellung), verhält sich die Shell so, als wäre der Wert leer, wenn dotglob
gesetzt ist, und als ob der Wert .*
wäre wenn die Option nicht gesetzt ist. Siehe Dateinamenerweiterung im Handbuch. Die allgegenwärtigen Verzeichnisse .
und ..
werden immer weggelassen, es sei denn, die .
wird explizit durch das Muster abgeglichen.
$ GLOBIGNORE='n*'
$ echo *
..two .one zero
$ echo .*
..two .one
$ unset GLOBIGNORE
$ echo .*
. .. ..two .one
$ GLOBIGNORE=.:..
$ echo .*
..two .one
Ksh93
Stellen Sie FIGNORE
ein Variable. Wenn nicht gesetzt (Standardeinstellung), verhält sich die Shell so, als wäre der Wert .*
. .
ignorieren und ..
, müssen sie explizit abgeglichen werden (das Handbuch in ksh 93s+ 2008-01-31 besagt, dass .
und ..
werden immer ignoriert, aber das beschreibt das tatsächliche Verhalten nicht richtig).
$ echo *
none zero
$ FIGNORE='@(.|..)'
$ echo *
..two .one none zero
$ FIGNORE='n*'
$ echo *
. .. ..two .one zero
Sie können Punktdateien in ein Muster einbeziehen, indem Sie sie explizit abgleichen.
$ unset FIGNORE
$ echo @(*|.[^.]*|..?*)
..two .one none zero
Um die Erweiterung leer erscheinen zu lassen, wenn das Verzeichnis leer ist, verwenden Sie den N
Mustervergleichsoption:~(N)@(*|.[^.]*|..?*)
oder ~(N:*|.[^.]*|..?*)
.
Schsch
Setzen Sie den dot_glob
Option.
% echo *
none zero
% setopt dot_glob
% echo *
..two .one none zero
.
und ..
werden niemals abgeglichen, selbst wenn das Muster mit dem führenden .
übereinstimmt explizit.
% echo .*
..two .one
Mit dem D
können Sie Punktdateien in ein bestimmtes Muster einfügen Glob-Qualifizierer.
% echo *(D)
..two .one none zero
Fügen Sie das N
hinzu Glob-Qualifizierer, um die Erweiterung in einem leeren Verzeichnis leer erscheinen zu lassen:*(DN)
.
Hinweis:Möglicherweise erhalten Sie Ergebnisse der Dateinamenerweiterung in unterschiedlicher Reihenfolge
(z. B. none
gefolgt von .one
gefolgt von ..two
)
basierend auf Ihren Einstellungen des LC_COLLATE
, LC_ALL
, und LANG
Variablen.