*
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
, mksh
noch 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 zsh
können Sie das (D)
Glob-Qualifikationsmerkmal verwenden, um anzugeben, dass der Glob Punktdateien enthalten soll:
mv -- *(D) /dest/
zsh
Es wurde auch behoben, dass andere Fehlfunktionen der Bourne-Shell darin bestehen, dass der mv
Befehl 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 bash
gibt es keine Glob-Qualifikation. Sie müssen also die Dotfile-Aufnahme global aktivieren. In bash
lautet die Syntax:
shopt -s dotglob
(und [^.]*
für Globs ohne versteckte Dateien verwenden).
Mit dotglob
, bash
nicht enthalten .
noch ..
in Globs wie *
, aber immer noch für Globs wie .*
.
Wenn Sie die GLOBIGNORE
Variable auf einen nicht leeren Wert setzen, wird die dotglob
Option automatisch aktiviert und es werden .
und ..
von .*
Globs ausgeschlossen, jedoch nicht von dir/.*
oder .*/file
one (!), 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 dotglob
aktiviertem) zu erweitern ..
..
Fisch
fish
Globs 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 -- /dest
wenn ü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
yash
hat eine dot-glob
Option ( set -o dot-glob
), aber im Gegensatz dazu enthalten bash
die 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 ..
).