(12 Antworten)
Vor 6 Jahren geschlossen.
Ich möchte jede versteckte Datei und jedes Verzeichnis globen, aber nicht die aktuelle (.
) und übergeordnetes Verzeichnis (..
).
Ich verwende bash.
Aktuelles Verhalten beobachten:
$ ls -a
. .. ...a ...aa ..a ..aa .a .aa .aaa a
$ echo *
a
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
Ich möchte .*
sich so zu verhalten
$ echo .*
...a ...aa ..a ..aa .a .aa .aaa
Es gibt die Shell-Option dotglob
$ shopt -s dotglob
das funktioniert irgendwie; jetzt kann ich *
verwenden um alles zu globen (versteckt oder nicht), aber nicht .
und ..
$ echo *
...a ...aa ..a ..aa .a .aa .aaa a
aber jetzt kann ich nicht zwischen versteckt oder nicht unterscheiden. Auch .*
immer noch Globs .
und ..
$ echo .*
. .. ...a ...aa ..a ..aa .a .aa .aaa
Gibt es eine Möglichkeit, .*
zu erstellen nicht zu .
erweitern und ..
?
Akzeptierte Antwort:
Sie können die GLOBIGNORE
verwenden Variable, um .
auszublenden und ..
Verzeichnisse. Dadurch wird automatisch auch der dotglob
gesetzt Option, also *
stimmt nun mit versteckten und nicht versteckten Dateien überein. Sie können dotglob
wieder manuell deaktivieren , aber das gibt dann das gewünschte Verhalten.
Siehe dieses Beispiel:
$ ls -a
. .. a .a ..a
$ GLOBIGNORE=".:.."
$ shopt -u dotglob
$ echo * # all (only non-hidden)
a
$ echo .* # all (only hidden)
.a ..a