Stellen Sie sich einen Quellbaum vor. Es gibt überall XML-Dateien.
Da sich jedoch eine XYZ.xml im Stammverzeichnis dieses Baums befindet, werden meine XML-Dateien nicht gefunden.
find -iname *.xml
kehrt zurück
./XYZ.xml
anstatt
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
man find
: Bitte beachten Sie, dass Sie Muster selbstverständlich zitieren sollten, da sonst die Shell alle darin enthaltenen Platzhalterzeichen erweitert.Antworten:
Andernfalls Shell erweitert
*.xml
zuXYZ.xml
, und der Befehl , dass tatsächlich ausgeführt wird istDer Grund, warum es funktioniert, wenn das aktuelle Verzeichnis keine XML-Dateien enthält, ist, dass Shells im Allgemeinen Platzhalter nicht erweitern, wenn sie mit nichts übereinstimmen. Im Allgemeinen sollten Sie jederzeit Platzhalter durch ein anderes Programm als die Schale erweitert werden sollen (zB durch
find
,tar
,scp
, etc.) müssen Sie sie zitieren , so wird nicht die Shell versuchen , sie selbst zu erweitern.quelle
bash
, nicht von istfind
.Sie müssen Ihr Argument folgendermaßen zitieren:
so dass es übergeben wird, um zu finden, anstatt von der Shell erweitert zu werden, und dann übergeben wird, um als erweiterte Version zu finden.
quelle
*.xml
also nichts im aktuellen Verzeichnis übereinstimmt, wird es buchstäblich weitergegeben, weshalb es im anderen Fall funktioniert. Sehr hilfreiche Antwort.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 Shellls
die resultierende Liste der Argumente auffile1.xml
file2.xml
file3.xml
. Aus diesem Grund wird dieselbe Liste mit Dateinamen angezeigtecho *.xml
, obwohlecho
nichts über Dateien bekannt ist und es egal ist, ob es sich bei den Argumenten um Dateinamen handelt.Wenn Sie laufen
find . -name "*.xml"
:find
,.
,-name
,*.xml
wo die*
zitiert. Da*
zitiert wird, ist es ein gewöhnlicher Charakter, was die Shell betrifft.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
:find
,.
,-name
,*.xml
wo der*
nicht zitiert.*.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.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ältfile1.xml
,file2.xml
undfile3.xml
:find
,.
,-name
,*.xml
wo der*
nicht zitiert.*.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.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 wirdfile2.xml
.Wenn Sie ausführen
find . -name *.xml
und das aktuelle Verzeichnis eine einzelne übereinstimmende Datei enthältfile.xml
:find
,.
,-name
,*.xml
wo der*
nicht zitiert.*.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.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: Esfind
wird angewiesen, nach Dateien zu suchen, diefile.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.)
quelle
Dies funktioniert unter Solaris 10:
find /directory-to-search/* -prune -name "*gz"
quelle
.xml
.Bitte versuche:
quelle
*
sollten immer zitiert oder entkommen sein, um sie zu finden.