*ist ein Glob, der von der Shell erweitert wird. Standardmäßig enthalten Shells keine Dateien, deren Name mit einem .(als versteckte Dateien oder Punktdateien bezeichnet) beginnt, es sei denn, der führende .wird wörtlich eingegeben.
*oder [.]*oder ?*oder *.*oder dir/*wird keine Punktdateien enthalten.
.*oder dir/.*wird.
So könnten Sie tun:
mv -- * .* /dest/
jedoch einige Schalen einschließlich bash(aber nicht zsh, mkshnoch fish) haben , dass misfeature dass die Ausweitung der .*die umfassen .und ..spezielle Verzeichniseinträge, die Sie nicht wollen , hier (und in der Regel nie eine glob aufnehmen möchten, weshalb ich es nennen misfeature).
Aus diesem Grund werden Sie feststellen, dass Menschen manchmal (in Bourne-ähnlichen Muscheln) verwenden:
mv -- * .[!.]* ..?* /dest/
Das sind drei Globs, wobei der erste mit nicht versteckten Dateien übereinstimmt, der zweite mit Dateinamen beginnt, .gefolgt von einem anderen Zeichen als .und der dritte mit Dateinamen, ..gefolgt von mindestens einem Zeichen.
Einige moderne Muscheln haben jedoch bessere Möglichkeiten, dies zu umgehen
zsh
Mit zshkönnen Sie das (D)Glob-Qualifikationsmerkmal verwenden, um anzugeben, dass der Glob Punktdateien enthalten soll:
mv -- *(D) /dest/
zshEs wurde auch behoben, dass andere Fehlfunktionen der Bourne-Shell darin bestehen, dass der mvBefehl nicht ausgeführt wird , wenn das Muster nicht übereinstimmt .
Wie oben gesagt wird es auch nie gehört .noch ..in seiner Kleckse, so
mv -- * .* /dest/
wird sicher sein. Wenn jedoch keine Datei *oder keine Datei übereinstimmt, wird .*der Befehl abgebrochen. Daher ist es besser, Folgendes zu verwenden:
mv -- (*|.*) /dest/
Wie in einigen anderen Shells können Sie auch alle Globs zwingen, Dotfiles einzuschließen (z. B. wenn Sie möchten, dass Dotfiles häufiger enthalten sind):
setopt dotglob
oder:
set -o dotglob
Wenn Sie danach möchten, dass ein bestimmter Glob keine Punktdateien enthält, können Sie ihn schreiben:
echo *(^D)
Oder:
echo [^.]*
Bash
Leider bashgibt es keine Glob-Qualifikation. Sie müssen also die Dotfile-Aufnahme global aktivieren. In bashlautet die Syntax:
shopt -s dotglob
(und [^.]*für Globs ohne versteckte Dateien verwenden).
Mit dotglob, bashnicht enthalten .noch ..in Globs wie *, aber immer noch für Globs wie .*.
Wenn Sie die GLOBIGNOREVariable auf einen nicht leeren Wert setzen, wird die dotglobOption automatisch aktiviert und es werden .und ..von .*Globs ausgeschlossen, jedoch nicht von dir/.*oder .*/fileone (!), So dass der Schutz ziemlich nutzlos ist. Sie könnten tun, GLOBIGNORE='*/.:*/..:./*:../*:*/./*:*/../*'aber dann würde es Globs wie */.oder ./*oder brechen ../*.
Eine bessere Lösung besteht darin, Dotfiles mit Ausnahme von und [.]*oder dir/[.]*oder [.]*/file(mit dotglobaktiviertem) zu erweitern ....
Fisch
fishGlobs enthalten weder .noch ... Wenn es je nach Version keine Übereinstimmung gibt, funktioniert es entweder zsh(oder bash -o failglob) oder bash -o nullglob.
mv -- * .* /dest/
Würde funktionieren, wenn es sowohl versteckte als auch nicht versteckte Dateien gibt. Andernfalls wird YMMV und bei einigen Versionen möglicherweise aufgerufen, mv -- /destwenn überhaupt keine Datei vorhanden ist.
ksh93
Auch kein Glob-Qualifier ksh93. Sie können Punktedateien in Globs einfügen mit:
FIGNORE='@(.|..)'
Im Gegensatz zu bash‚s GLOBIGNORE, die richtig und auch getan behebt das Problem , .*einschließlich .und ...
yash
yashhat eine dot-globOption ( set -o dot-glob), aber im Gegensatz dazu enthalten bashdie Glob-Erweiterungen (sogar von *) .und ist ..daher ziemlich nutzlos.
tcsh
set globdot
Funktioniert wie in bash, *dh enthält Punktdateien mit Ausnahme von .und enthält ..jedoch .*weiterhin .und ..(und Sie können [.]*versteckte Dateien mit Ausnahme von .und erweitern ..).