Platzhalter werden durch die Shell und nicht durch den Befehl erweitert. findist 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 *.xmlauf die Liste der übereinstimmenden Dateien erweitert, z. B. file1.xml file2.xml file3.xml, und dann ruft die Shell lsdie resultierende Liste der Argumente auf file1.xml file2.xml file3.xml. Aus diesem Grund wird dieselbe Liste mit Dateinamen angezeigt echo *.xml, obwohl echonichts ü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, *.xmlwo die *zitiert. Da *zitiert wird, ist es ein gewöhnlicher Charakter, was die Shell betrifft.
- Die Schale führt den Befehl
findmit der angegebenen Liste von Argumenten: ., -name, *.xml.
findsucht nach Dateien, deren Name mit dem Muster *.xmlin einem beliebigen Verzeichnis unter dem aktuellen Verzeichnis übereinstimmt .
Wenn Sie ausführen find . -name *.xmlund 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, *.xmlwo der *nicht zitiert.
- Da das Wort
*.xmlein 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
findmit der resultierenden Liste von Argumenten, die sind ., -name, *.xml.
findsucht nach Dateien, deren Name mit dem Muster *.xmlin einem beliebigen Verzeichnis unter dem aktuellen Verzeichnis übereinstimmt .
Wenn Sie ausführen find . -name *.xmlund das aktuelle Verzeichnis enthält file1.xml, file2.xmlund 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, *.xmlwo der *nicht zitiert.
- Da das Wort
*.xmlein nicht in Anführungszeichen gesetztes Platzhalterzeichen enthält, führt die Shell die Dateinamengenerierung durch: *.xmlwird durch die Liste der übereinstimmenden Dateinamen ersetzt.
- Die Schale führt den Befehl
findmit der resultierenden Liste von Argumenten, die sind ., -name, file1.xml, file2.xml, file3.xml.
findbeschwert sich über einen Syntaxfehler, wenn er erreicht wird file2.xml.
Wenn Sie ausführen find . -name *.xmlund 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, *.xmlwo der *nicht zitiert.
- Da das Wort
*.xmlein nicht in Anführungszeichen gesetztes Platzhalterzeichen enthält, führt die Shell die Dateinamengenerierung durch: *.xmlwird durch die Liste der übereinstimmenden Dateinamen ersetzt.
- Die Schale führt den Befehl
findmit der resultierenden Liste von Argumenten, die sind ., -name, file.xml.
findsieht einen vollkommen gültigen Befehl, aber es ist wahrscheinlich nicht das, was Sie beabsichtigt haben: Es findwird angewiesen, nach Dateien zu suchen, die file.xmlin 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.