Platzhalter werden durch die Shell und nicht durch den Befehl erweitert. find
ist einer der wenigen Befehle, die in ihrer eigenen Zeit einen Wildcard-Abgleich durchführen, der der Shell ähnelt.
Wenn Sie ausführen ls *.xml
, wird zuerst die Shell *.xml
auf die Liste der übereinstimmenden Dateien erweitert, z. B. file1.xml
file2.xml
file3.xml
, und dann ruft die Shell ls
die resultierende Liste der Argumente auf file1.xml
file2.xml
file3.xml
. Aus diesem Grund wird dieselbe Liste mit Dateinamen angezeigt echo *.xml
, obwohl echo
nichts über Dateien bekannt ist und es egal ist, ob es sich bei den Argumenten um Dateinamen handelt.
Wenn Sie laufen find . -name "*.xml"
:
- Die Shell analysiert die Befehlszeile, um Sonderzeichen zu erkennen und in Wörter und Puntuation aufzuteilen. Hier gibt es nur eine Liste von Wörtern
find
, .
, -name
, *.xml
wo die *
zitiert. Da *
zitiert wird, ist es ein gewöhnlicher Charakter, was die Shell betrifft.
- Die Schale führt den Befehl
find
mit der angegebenen Liste von Argumenten: .
, -name
, *.xml
.
find
sucht nach Dateien, deren Name mit dem Muster *.xml
in einem beliebigen Verzeichnis unter dem aktuellen Verzeichnis übereinstimmt .
Wenn Sie ausführen find . -name *.xml
und keine übereinstimmenden Dateien vorhanden sind *.xml
:
- Die Shell analysiert die Befehlszeile, um Sonderzeichen zu erkennen und in Wörter und Puntuation aufzuteilen. Hier gibt es nur eine Liste von Wörtern
find
, .
, -name
, *.xml
wo der *
nicht zitiert.
- Da das Wort
*.xml
ein nicht zitiertes Platzhalterzeichen enthält, führt die Shell die Dateinamengenerierung durch. Da keine übereinstimmenden Dateinamen vorhanden sind, bleibt das Muster nicht erweitert.
- Die Schale führt den Befehl
find
mit der resultierenden Liste von Argumenten, die sind .
, -name
, *.xml
.
find
sucht nach Dateien, deren Name mit dem Muster *.xml
in einem beliebigen Verzeichnis unter dem aktuellen Verzeichnis übereinstimmt .
Wenn Sie ausführen find . -name *.xml
und das aktuelle Verzeichnis enthält file1.xml
, file2.xml
und file3.xml
:
- Die Shell analysiert die Befehlszeile, um Sonderzeichen zu erkennen und in Wörter und Puntuation aufzuteilen. Hier gibt es nur eine Liste von Wörtern
find
, .
, -name
, *.xml
wo der *
nicht zitiert.
- Da das Wort
*.xml
ein nicht in Anführungszeichen gesetztes Platzhalterzeichen enthält, führt die Shell die Dateinamengenerierung durch: *.xml
wird durch die Liste der übereinstimmenden Dateinamen ersetzt.
- Die Schale führt den Befehl
find
mit der resultierenden Liste von Argumenten, die sind .
, -name
, file1.xml
, file2.xml
, file3.xml
.
find
beschwert sich über einen Syntaxfehler, wenn er erreicht wird file2.xml
.
Wenn Sie ausführen find . -name *.xml
und das aktuelle Verzeichnis eine einzelne übereinstimmende Datei enthält file.xml
:
- Die Shell analysiert die Befehlszeile, um Sonderzeichen zu erkennen und in Wörter und Puntuation aufzuteilen. Hier gibt es nur eine Liste von Wörtern
find
, .
, -name
, *.xml
wo der *
nicht zitiert.
- Da das Wort
*.xml
ein nicht in Anführungszeichen gesetztes Platzhalterzeichen enthält, führt die Shell die Dateinamengenerierung durch: *.xml
wird durch die Liste der übereinstimmenden Dateinamen ersetzt.
- Die Schale führt den Befehl
find
mit der resultierenden Liste von Argumenten, die sind .
, -name
, file.xml
.
find
sieht einen vollkommen gültigen Befehl, aber es ist wahrscheinlich nicht das, was Sie beabsichtigt haben: Es find
wird angewiesen, nach Dateien zu suchen, die file.xml
in einem Verzeichnis aufgerufen werden, und nicht nach übereinstimmenden Dateien *.xml
.
(Die Shell-Evaluierung und -Erweiterung bietet viele weitere Funktionen. Ich habe nur diejenigen erwähnt, die hier relevant sind.)
(Was ich beschreibe, ist das Standardverhalten der meisten gängigen Shells: sh, bash, dash, ksh, ... Einige Shells können so konfiguriert werden, dass ein Fehler angezeigt wird, anstatt einen Befehl mit nicht erweiterten Platzhaltern auszuführen oder nicht übereinstimmende Platzhalter zu leeren zu erweitern Liste. Keiner von denen würde hier helfen.)
man find
: Bitte beachten Sie, dass Sie Muster selbstverständlich zitieren sollten, da sonst die Shell alle darin enthaltenen Platzhalterzeichen erweitert.