¿Cómo puedo contar todos los scripts de Python y Shell en todo mi sistema?

¿Cómo puedo contar todos los scripts de Python y Shell en todo mi sistema?

¿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 findcomando como root sudosi realmente lo desea.

  • -type fhace que encuentre sólo archivos normales. Por lo general, es mejor incluir -xtype fenlaces simbólicos que resuelvan archivos normales, pero en este caso eso daría como resultado un conteo excesivo.
  • -executablehace que encuentre sólo archivos que sean ejecutables por el usuario que ejecuta find. 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 .o sourcedentro de ellos, o pueden ser Módulos de Python que se importarían con importo fromdentro de programas de Python. (Se podría pensar que esto no sucedería, ya que dichos archivos generalmente no tienen unael asunto, pero findbusca más que un tinglado). Sin embargo, puede omitirlo -executablesi 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 filecomando 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 grepcomando 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 texto python script,, shell script,o cualquier variante del mismo. Los archivos findidentificados 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 fileno 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 .pyarchivos, 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.exereconoce 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á findla -executableprueba. Tenga en cuenta que este es un problema diferente al de ejecutarlo findcomo 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 ( /), findtodos los archivos y canalizaciones hasta el xargscomando como nombres terminados en bytes cero.

El xargscomando se ejecuta en paralelo maximizando las 8 CPU para un procesamiento más rápido. Cada proceso paralelo llama al filecomando que obtiene una descripción del archivo como se muestra en la sección anterior.

El grepcomando selecciona scripts de shell y scripts de Python.

El sortcomando ordena los scripts de Shell y los scripts de Python.

El uniqcomando 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:

encontrar xargs 8 cores.gif

La belleza de Linux brilla porque otros trabajos, como el grabador de pantalla .gify el vídeo que se ejecuta en el tercer monitor (TV de pantalla grande), continúan funcionando normalmente. Linux no permite que el xargs filecomando atasque el sistema.

información relacionada