Platzhalterzeichen `*` kann nicht mit einer Zeichenfolge übereinstimmen?

7
ls  -al  .functions*
-rw-r--r-- 1 root root 471040 Mar  2 10:01 .functions.php.swo
-rw-r--r-- 1 root root 438272 Mar  2 09:57 .functions.php.swp

*kann übereinstimmen .php.swound .php.swp
warum *kann nicht übereinstimmen .functions.php?

ls  -al  *.swo
ls: cannot access '*.swo': No such file or directory
ls  -al  *swo
ls: cannot access '*swo': No such file or directory
kratzig
quelle

Antworten:

10

Dateien, die mit einem Punkt beginnen, werden standardmäßig in Dateilisten ausgeblendet. Der einfachste Weg, um diese Art von Dateien abzugleichen, besteht darin, einen Punkt am Anfang des Ausdrucks zu setzen. Dies stimmt jedoch nur mit Dateien überein, die mit beginnen ..

ls  -al  .*.swo

Die Alternative besteht darin, die Einstellung dotglobvor dem Ausführen des Befehls festzulegen. Anschließend werden Dateien eingeschlossen, die mit beginnen ..

shopt -s dotglob

Fügen Sie es zu Ihrem hinzu ~/.bashrc, um es standardmäßig festzulegen.

Beachten Sie, dass die Einstellungdotglob bei Verwendung der Bash-Shell zu unbeabsichtigten Ergebnissen führen kann, da bei Verwendung sowohl .(aktuelles Verzeichnis) als auch ..(übergeordnetes Verzeichnis) angezeigt werden *. Versuchen Sie niemals , mit dotglobset zu verwenden .rm -R *

Shaido - Monica wieder einsetzen
quelle
8
Warnung: dotglob kann unerwartete Folgen haben, da *es .(das aktuelle Verzeichnis) und ..(das übergeordnete Verzeichnis des aktuellen Verzeichnisses) enthält. Versuchen Sie dann, dotglob einzustellen ls *. Sie nicht versuchen rm -R *.
Gordon Davisson
@GordonDavisson: Die Warnung wurde der Antwort hinzugefügt, damit sie nicht verloren geht / entfernt wird.
Shaido - Monica am
4
Bitte beachten Sie, dass andere Shells wie zshDotglob tatsächlich auf eine Weise implementieren, die weder .noch ..- meiner Meinung nach ein viel nützlicheres Verhalten
Mnagel
@Shaido Vielleicht wäre fett eine gute Idee. Dies ist eine sehr unerwartete und gefährliche Funktion, und ich kenne Leute, die sie immer verwenden -f.
wizzwizz4
Zu Ihrer Information, diese Muster sind keine regulären Ausdrücke. Sie werden entweder Globs oder Wildcards genannt.
Barmar
11

Als Erweiterung von Shaidos Antwort möchte ich eine Erklärung geben, warum die -aOption hier nicht funktioniert:

Der lsBefehl wird nicht verarbeiten Platzhalter. Der Befehlszeileninterpreter führt diesen Schritt aus:

Wenn Sie die Befehlszeile " mycommand *.c" eingeben, ersetzt der Befehlszeileninterpreter zuerst die Platzhalterzeichenfolge " *.c" durch die Liste der übereinstimmenden Dateien und führt dann die resultierende Befehlszeile aus:

mycommand a.c file.c test.c

Der Befehlszeileninterpreter funktioniert für alle Befehle auf die gleiche Weise, sodass er nicht wissen kann, dass -adies im Fall des lsBefehls "versteckte Dateien einschließen" bedeutet (während er -afür andere Befehle eine völlig andere Bedeutung hat) ...

Martin Rosenau
quelle