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 la file
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
con find
para detectar el tipo MIME de archivos regulares, y utilícelo para encontrar scripts de shell:
find . -type f -exec sh -c '
case $( file -bi "$1" ) in
*/x-shellscript*) exit 0
esac
exit 1' sh {} ';' -print
o, usando bash
,
find . -type f \
-exec bash -c '[[ "$( file -bi "$1" )" == */x-shellscript* ]]' bash {} ';' \
-print
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 ejecuta file -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 hace find
que continúe inmediatamente con el siguiente archivo. Si se encontró que el archivo era un script de shell, el find
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í como
text/x-shellscript; charset=us-ascii
mientras que en sistemas con una variante un poco más antigua de la file
utilidad, puede ser
application/x-shellscript
El bit común es la /x-shellscript
subcadena.
Tenga en cuenta que en macOS, debería usarlo en file -bI
lugar de file -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 los find
comandos anteriores, pero también sería posible hacerlo
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 {} +
o, con 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 {} +
Relacionado:
--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.