Sé que puedo encontrar archivos utilizando find
: find . -type f -name 'sunrise'
. Resultado de ejemplo:
./sunrise
./events/sunrise
./astronomy/sunrise
./schedule/sunrise
También sé que puedo determinar el tipo de archivo de un archivo: file sunrise
. Resultado de ejemplo:
sunrise: PEM RSA private key
Pero, ¿cómo puedo encontrar archivos por tipo de archivo?
Por ejemplo my-find . -type f -name 'sunrise' -filetype=bash-script
:
./astronomy/sunrise
./schedule/sunrise
files
find
file-command
file-types
Flujo
fuente
fuente
--filetype
opción para el comando de búsqueda o cualquier otra cosa que le diga el tipo de archivo. Lo único que puede hacer es usarlo--exec file {} \;
y luego conectarlogrep Bourne
si estaba buscando scripts de bash ogrep Perl
si estaba buscando scripts de Perl o algo por el estilo.Respuestas:
Los "tipos de archivos" en un sistema Unix son cosas como archivos normales, directorios, canalizaciones con nombre, archivos especiales de caracteres, enlaces simbólicos, etc. Estos son el tipo de archivos que
find
pueden filtrarse con su-type
opción.La
find
utilidad por sí sola no puede distinguir entre un "script de shell", un "archivo de imagen JPEG" o cualquier otro tipo de archivo normal . Sin embargo, estos tipos de datos se pueden distinguir por lafile
utilidad, que analiza firmas particulares dentro de los propios archivos para determinar su tipo.Una forma común de etiquetar los diferentes tipos de archivos de datos es por su tipo MIME , y
file
es capaz de determinar el tipo MIME de un archivo.Utilizando
file
confind
para detectar el tipo MIME de archivos regulares, y utilícelo para encontrar scripts de shell:o, usando
bash
,Agregue
-name sunrise
antes-exec
si solo desea detectar scripts con ese nombre.El
find
comando anterior encontrará todos los archivos normales en o debajo del directorio actual, y para cada uno de estos archivos, llame a un breve script de shell en línea. Este script se ejecutafile -bi
en el archivo encontrado y sale con un estado de salida cero si la salida de ese comando contiene la cadena/x-shellscript
. Si la salida no contiene esa cadena, sale con un estado de salida distinto de cero que hacefind
que continúe inmediatamente con el siguiente archivo. Si se encontró que el archivo era un script de shell, elfind
comando procederá a generar el nombre de ruta del archivo (-print
al final, que también podría ser reemplazado por alguna otra acción).El
file -bi
comando generará el tipo MIME del archivo. Para un script de shell en Linux (y la mayoría de los otros sistemas), esto sería algo así comomientras que en sistemas con una variante un poco más antigua de la
file
utilidad, puede serEl bit común es la
/x-shellscript
subcadena.Tenga en cuenta que en macOS, debería usarlo en
file -bI
lugar defile -bi
por razones (la-i
opción hace algo bastante diferente). La salida en macOS es similar a la de un sistema Linux.Si desea realizar alguna acción personalizada en cada script de shell encontrado, puede hacerlo con otro
-exec
en lugar de-print
en losfind
comandos anteriores, pero también sería posible hacerloo, con
bash
,Relacionado:
fuente
Puede ejecutar
find
en cada archivo encontrado y luego buscar el resultado que le interesa.Sugiero que el patrón de búsqueda sea lo más cercano posible a sus expectativas para mantener bajo el número de falsos positivos.
Tenga en cuenta que los archivos con líneas nuevas en sus nombres de archivo pueden causar problemas con este enfoque.
fuente
Usando
perl
elFile::LibMagic
módulo de:fuente