Ich weiß, dass ich Dateien finden kann mit find
: find . -type f -name 'sunrise'
. Beispielergebnis:
./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
Ich weiß auch, dass ich den Dateityp einer Datei bestimmen kann : file sunrise
. Beispielergebnis:
sunrise: PEM RSA private key
Aber wie kann ich Dateien nach Dateityp finden?
Zum Beispiel my-find . -type f -name 'sunrise' -filetype=bash-script
:
./astronomy/sunrise
./schedule/sunrise
files
find
file-command
file-types
Fluss
quelle
quelle
--filetype
Option für den Befehl find oder etwas anderes, das Ihnen den Dateityp angibt. Das einzige, was Sie tun können, ist, es zu verwenden--exec file {} \;
und dann weiterzuleiten,grep Bourne
wenn Sie nach Bash-Skripten suchen odergrep Perl
wenn Sie nach Perl-Skripten oder etwas in dieser Richtung suchen.Antworten:
"Dateitypen" auf einem Unix-System sind normale Dateien, Verzeichnisse, Named Pipes, spezielle Zeichendateien, symbolische Links usw. Dies sind die Dateitypen,
find
nach denen mit ihrer-type
Option gefiltert werden kann .Das
find
Dienstprogramm kann selbst nicht zwischen einem "Shell-Skript", einer "JPEG-Bilddatei" oder einem anderen Typ einer regulären Datei unterscheiden . Diese Datentypen können jedoch durch dasfile
Dienstprogramm unterschieden werden , das bestimmte Signaturen in den Dateien selbst untersucht, um ihren Typ zu bestimmen.Eine übliche Methode zum Beschriften der verschiedenen Datendateitypen ist der MIME-Typ , mit
file
dem der MIME-Typ einer Datei ermittelt werden kann.Verwenden von
file
withfind
, um den MIME-Typ regulärer Dateien zu erkennen und damit nur Shell-Skripte zu finden:oder mit
bash
,Fügen Sie
-name sunrise
vor dem hinzu,-exec
wenn Sie nur Skripte mit diesem Namen erkennen möchten.Der
find
obige Befehl findet alle regulären Dateien im oder unter dem aktuellen Verzeichnis und ruft für jede dieser Dateien ein kurzes Inline-Shell-Skript auf. Dieses Skript wirdfile -bi
für die gefundene Datei ausgeführt und mit einem Exit-Status von Null beendet, wenn die Ausgabe dieses Befehls die Zeichenfolge enthält/x-shellscript
. Wenn die Ausgabe diese Zeichenfolge nicht enthält, wird sie mit einem Exit-Status ungleich Null beendet, wodurchfind
sofort mit der nächsten Datei fortgefahren wird. Wenn festgestellt wurde, dass es sich bei der Datei um ein Shell-Skript handelt, gibt derfind
Befehl den Pfadnamen der Datei aus (den-print
am Ende, der auch durch eine andere Aktion ersetzt werden kann).Der
file -bi
Befehl gibt den MIME-Typ der Datei aus. Für ein Shell-Skript unter Linux (und den meisten anderen Systemen) wäre dies ungefähr soAuf Systemen mit einer etwas älteren Variante des
file
Dienstprogramms kann dies der Fall seinDas gemeinsame Bit ist der
/x-shellscript
Teilstring.Beachten Sie, dass Sie unter macOS aus Gründen
file -bI
anstelle von verwenden müssten (die Option macht etwas ganz anderes). Die Ausgabe unter macOS ähnelt der eines Linux-Systems.file -bi
-i
Wenn Sie eine benutzerdefinierte Aktion für jedes gefundene Shell-Skript ausführen möchten, können Sie dies mit einer anderen Aktion
-exec
anstelle der-print
in denfind
obigen Befehlen beschriebenen tun. Dies ist jedoch auch möglichoder mit
bash
,Verbunden:
quelle
Sie können
find
jede gefundene Datei ausführen und dann nach dem gewünschten Ergebnis suchen.Ich schlage vor, das Suchmuster so nah wie möglich an Ihre Erwartung zu bringen, um die Anzahl der falsch positiven Übereinstimmungen niedrig zu halten.
Beachten Sie, dass Dateien mit Zeilenumbrüchen in ihren Dateinamen Probleme mit diesem Ansatz verursachen können.
quelle
Verwenden
perl
desFile::LibMagic
Moduls:quelle