¿Cómo ejecutar todos los scripts en una ruta?

13

Supongamos que tengo un script que recibe una ruta como parámetro. ¿Cómo podría ejecutar todos los scripts ubicados en esa ruta?

Lautaro Alvarez
fuente

Respuestas:

14

Suponiendo que por ruta se refería a la ruta a un directorio, use run-parts. De man run-parts:

run-parts - run scripts or programs in a directory

Al principio, debe establecer el permiso de ejecución en todos los scripts que desea ejecutar. Normalmente run-partsignorará los directorios y también los archivos que no son ejecutables residen en ese directorio.

Aunque antes de ejecutar debe verificar qué archivos se ejecutarán con la --testopción:

run-parts --test /path/to/directory

Debo mencionar que run-partstiene una convención de nomenclatura estricta para que se ejecuten los scripts:

If neither the --lsbsysinit option nor the --regex option is given 
then the names must consist entirely of ASCII upper- and
lower-case letters, ASCII digits, ASCII underscores, and ASCII minus-hyphens.

Comprueba man run-partspara tener más idea.

heemayl
fuente
Leyendo un poco, encontré esto: #! / Bin / bash scripts_to_run_dir = / home / you / Dropbox / scripts_to_run para el script en "$ scripts_to_run_dir" / * do if test -x "$ script"; luego "$ script" fi hecho Funcionó para mí, ¿qué te parece?
Lautaro Alvarez
@LautaroAlvarez Lo que está haciendo con esa secuencia de comandos, se podría hacer fácilmente con un simple comando ... run-parts /home/you/Dropbox/scripts_to_runtenga cuidado con la nomenclatura ...
heemayl
run-parts es genial. Pero hizo cron.d y escribió en syslog como cron.notice. Pero es una buena fuente de ideas, como omitir la temperatura y los archivos de copia de seguridad ...
mmv-ru
9

Run-parts funcionará si sus scripts tienen los nombres correctos. Si no desea tratar de cambiar el nombre de sus scripts para que se ajusten run-partsal complejo esquema de nombres, puede hacer algo tan simple como

for file in ~/target/*; do $file 2>/dev/null; done

Eso intentará ejecutar todos los archivos (y directorios) encontrados en ~/target. Los 2>/dev/nullmensajes de error vuelve a dirigir por lo que no se quejan al intentar ejecutar directorios o archivos no ejecutables.

Alternativamente, puedes probar el más sofisticado

for file in ~/target/*; do
    [ -f "$file" ] && [ -x "$file" ] && "$file"
done

Esto verificará si cada uno de los resultados es un archivo ( [ -f $file ]), es ejecutable ( [ -x $file ]) y solo si ambas pruebas son exitosas, intentará ejecutar el archivo.

terdon
fuente
Este funcionó perfectamente para mí en un proyecto (un repositorio bifurcado) en el que estoy trabajando: github.com/rattfieldnz/Vaprobash/blob/master/setup_projects.sh .
Rob