"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 das file
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
with find
, um den MIME-Typ regulärer Dateien zu erkennen und damit nur Shell-Skripte zu finden:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
oder mit bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
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 wird file -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, wodurch find
sofort mit der nächsten Datei fortgefahren wird. Wenn festgestellt wurde, dass es sich bei der Datei um ein Shell-Skript handelt, gibt der find
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 so
text/x-shellscript; charset=us-ascii
Auf Systemen mit einer etwas älteren Variante des file
Dienstprogramms kann dies der Fall sein
application/x-shellscript
Das gemeinsame Bit ist der /x-shellscript
Teilstring.
Beachten Sie, dass Sie unter macOS aus Gründenfile -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 den find
obigen Befehlen beschriebenen tun. Dies ist jedoch auch möglich
find . -type f -exec sh -c '
for pathname do
case $( file -bi "$pathname" ) in
*/x-shellscript*) ;;
*) continue
esac
# some code here that acts on "$pathname"
done' sh {} +
oder mit bash
,
find . -type f -exec bash -c '
for pathname do
[[ "$( file -bi "$pathname" )" != */x-shellscript* ]] && continue
# some code here that acts on "$pathname"
done' bash {} +
Verbunden:
--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.