¿Cómo puedo contar todos los scripts de Python y Shell en todo mi sistema?
Respuesta1
En ausencia de un objetivo más específico, esto será aproximado sin importar cómo lo haga, debido a las ambigüedades sobre qué constituye un script de Shell y qué constituye un script de Python. Eso no hace que el problema esté demasiado mal definido,siempre y cuando una aproximación sea lo que quieres. Y puedes obtener una buena aproximación.
Teniendo esto en cuenta, sugiero este comando para enumerar los scripts de Shell y Python:
find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,'
Si el resultado parece razonable para sus necesidades, puede ejecutarlo nuevamente, modificado para contar la cantidad de resultados:
find . -type f -executable -exec file {} + | grep -Ei '(python|shell) script,' | wc -l
Es posible que reciba algunos errores de "Permiso denegado". Esta bien. No recomiendo intentar suprimir esos mensajes de error, porque debe leerlos o al menos escanearlos para ver si parece que no pudo acceder a ningún archivo o ubicación que fuera de su interés. Puede ejecutar el find
comando como root sudo
si realmente lo desea.
-type f
hace que encuentre sólo archivos normales. Por lo general, es mejor incluir-xtype f
enlaces simbólicos que resuelvan archivos normales, pero en este caso eso daría como resultado un conteo excesivo.-executable
hace que encuentre sólo archivos que sean ejecutables por el usuario que ejecutafind
. Mirar archivos no ejecutables para ver si parecen ser scripts de Shell o Python haría que el comando demore considerablemente más. También puede obtener más falsos positivos de esta manera, en el sentido de que los archivos que no son ejecutables pueden ser "bibliotecas" en lugar de scripts, es decir, pueden consistir en comandos de shell y estar destinados a ser fuente de scripts de shell.
osource
dentro de ellos, o pueden ser Módulos de Python que se importarían conimport
ofrom
dentro de programas de Python. (Se podría pensar que esto no sucedería, ya que dichos archivos generalmente no tienen unael asunto, perofind
busca más que un tinglado). Sin embargo, puede omitirlo-executable
si lo desea, ysi estas dispuesto a esperarmientras su comando intenta abrir y leer el comienzo de cada archivo normal en su sistema.-exec ... +
ejecuta un comando...
con los archivos encontrados como argumentos de línea de comando. Ejecuta el comando tantas veces como sea necesario para procesar todos los archivos. A menudo esto ocurre sólo una vez; para todos los archivos ejecutables en todo su sistema, probablemente será más de una vez, pero muchas menos veces que si lo ejecutara una vez por archivo (como-exec ... \;
haría). Incluso con la misma cantidad de archivos, ejecutar un comando menos veces tiende a ser notablemente más rápido que ejecutarlo más veces, porque hay una menor sobrecarga asociada.- El
file
comando mira el principio de un archivo y adivina, generalmente bastante bien, qué tipo de archivo es. Genera un formato de dos columnas, con la ruta o el nombre del archivo a la izquierda y un resumen de lo queamabledel archivo parece estar a la derecha. - El
grep
comando filtra su entrada y genera solo líneas que sin distinguir entre mayúsculas y minúsculas (-i
) coinciden con elexpresión regular extendida(-E
)(python|shell) script,
. Esas son las líneas que contienen el textopython script,
,shell script,
o cualquier variante del mismo. Los archivosfind
identificados como esos tipos de scripts mostrarán esto. wc -l
, que aparece en el segundo de los dos comandos mostrados arriba, cuenta líneas.
Como se muestra, esta técnica es totalmente inadecuada paramuchostareas que implican discernir qué tipo de archivos uno tiene.La razón es que un archivo puede tener texto como python script,
en su nombre, así como caracteres de nueva línea en su nombre que harían que la salida file
no fuera uno por línea.Generalmente es importante, y a menudo incluso vital, dar cuenta de tales cosas, y es posible hacerlo.En este caso, sin embargo, solo estás buscando una estimación (debido a la naturaleza confusa del problema en sí) y parece que no estás cambiando el nombre, modificando, eliminando o incluso creando nada basado directamente en el resultado, así que No creo que valga la pena preocuparse por eso. Si terminas repitiendo esto y definiendo el problema de manera más estricta, entonces podría valer la pena abordarlo.
Tenga en cuenta que hay un caso importante en el que es posible que desee considerar archivos no ejecutables como scripts: si tiene muchos scripts de Python traídos desde un sistema como Windows donde no están marcados como ejecutables. En ese caso, puede buscar .py
archivos, aunque tenga en cuenta que muchos de ellos probablemente sean módulos de Python en lugar de scripts de Python. Si se ha seguido la buena práctica de Python de poner un hashbang en la parte superior del script (esto es útil incluso en Windows, porque los py.exe
reconoce pyw.exe
, aunque desafortunadamente no siempre se hace), entonces se utiliza una técnica que busca solo hashbangs pero los ignora. un archivo ejecutable puede ser más adecuado a sus necesidades.
También existe un caso menor pero significativo en el que es posible que desee considerar archivos no ejecutables como scripts de cualquier tipo o, más precisamente, en el que es posible que desee probar la ejecutabilidad de otra manera. Si tiene una unidad montada noexec
, ningún archivo pasará find
la -executable
prueba. Tenga en cuenta que este es un problema diferente al de ejecutarlo find
como un usuario que no tiene permisos para ejecutar algunos archivos; como el problema de ejecutarlo como un usuario que no tiene permisos para buscar en algunos directorios, esto se puede resolver mediante ejecutándolo como un usuario suficientemente privilegiado.
Este problema,como lo has planteado, es inusual--normalmente uno querría encontrar escrituras de un idioma específico o una pequeña familia de idiomas estrechamente relacionados. Pero para beneficio de futuros lectores, tenga en cuenta que también se puede encontrar todos los scripts de shell (por ejemplo) en un directorio único, quizás grande, con una ligera modificación de los comandos anteriores. (Lo mismo vale para la técnica presentada enLa respuesta de WinEunuuchs2Unix--también es útil para eso.)
Por ejemplo, para buscar todos los scripts de shell en el directorio actual:
find . -type f -executable -exec file {} + | grep -Fi 'shell script,'
Respuesta2
Vista rápida
Aquí hay una guía sobre cómo hacerlo.
$ for f in * ; do file "$f" ; done
aptfielout: ASCII text, with very long lines
aptfilein: ASCII text, with very long lines
aptfileout: ASCII text
aptfileparse.sh: Bourne-Again shell script, ASCII text executable, with very long lines
aptfileparse.sh~: ASCII text, with very long lines
calc.py: Python script, UTF-8 Unicode text executable
catall.sh: Bourne-Again shell script, ASCII text executable
Elimine todos los archivos que no digan "script de shell Bourne-Again" o "script de Python". Agregar a la lista scripts de shell POSIX:
$ file /bin/zgrep
/bin/zgrep: POSIX shell script, ASCII text executable
una respuesta completa
/$ time find * -type f -print0 2>/dev/null | xargs -0 -P 8 file | \
sed 's/.*: //g' | sed 's/^ *//g' | \
grep -Eio 'shell script,|Python script,' | sort | uniq -c
19151 Python script,
127 python script,
18420 shell script,
real 16m14.939s
user 54m7.355s
sys 2m33.238s
Comenzando desde la raíz ( /
), find
todos los archivos y canalizaciones hasta el xargs
comando como nombres terminados en bytes cero.
El xargs
comando se ejecuta en paralelo maximizando las 8 CPU para un procesamiento más rápido. Cada proceso paralelo llama al file
comando que obtiene una descripción del archivo como se muestra en la sección anterior.
El grep
comando selecciona scripts de shell y scripts de Python.
El sort
comando ordena los scripts de Shell y los scripts de Python.
El uniq
comando cuenta las ocurrencias de cada grupo.
hechos graciosos
Realmente puedes poner a prueba tu sistema ejecutando las 8 CPU (en mi caso) a la vez:
La belleza de Linux brilla porque otros trabajos, como el grabador de pantalla .gif
y el vídeo que se ejecuta en el tercer monitor (TV de pantalla grande), continúan funcionando normalmente. Linux no permite que el xargs file
comando atasque el sistema.