¿Cómo hago que un directorio completo sea ejecutable?


14

Tengo una carpeta completa dedicada a los scripts de Python.

Estoy cansado de hacer chmod en cada nuevo script de Python que escribo.

¿Hay alguna manera de hacer que cada archivo dentro de mi carpeta sea ejecutable si es un script de Python?

Sería bueno tener un script que verifique cada vez que se crea un nuevo script .py y si hay un nuevo script .py, hágalo ejecutable allí mismo.

  • Yo uso Vim

¿Qué utilizas para escribir estos scripts? Sería posible configurarlo vimo emacshacerlo por usted.
muru

Yo uso vim. Y eso sería perfecto.
Dominici

¿hay subcarpetas en el directorio?
Jacob Vlijm el

No hay subcarpetas solo mis guiones.
Dominici

Respuestas:


10

Otra buena opción es Incron . Funciona en inotify con condiciones especificables para una ubicación determinada.

Entonces puedo decir que mire esta carpeta, cuando vea un archivo creado, ejecute un comando.

Así como una muestra incrontab ...

/path/to/scripts IN_CREATE chmod +x $@$#  # <--- this arcane bit is path ($@) + file ($#)

De manera similar, se podría usar la ruta / archivo como argumentos para un script bash para permitirle filtrar por .pyextensiones si es necesario.


No estoy seguro si la gente alguna vez vuelve a las preguntas ya respondidas para decir gracias ... pero de todos modos. Soy nuevo aquí, a quién le importa. Muchas gracias muchísimo. Estoy usando incron para casi todas las cosas en las que estoy trabajando en este momento.
Dominici

No te preocupes, claro que ha sido útil. :) El proyecto es un poco oscuro, así que me gusta compartirlo con la gente. Lo he hecho un gran uso para automatizar y canalizar todo tipo de cosas.
DivinusVox

5
chmod +x /path/to/python/scripts/dir/*.py 

Hará ejecutables todos los .pyarchivos actuales en el directorio / ruta / a / python / scripts / dir .

No conozco una herramienta automática como usted describe. Puede ser posible tener una macro en su editor que pueda hacer esto, pero no con el editor que uso. ;-)


44
Gracias por los consejos. El OP específicamente dijo scripts de python, por eso incluyo *.py. También supongo que los scripts de OP son propiedad de su ID de usuario estándar, por lo que no veo la necesidad de hacerlo sudo. Buena suerte a todos.
Shellter

1

Como primer paso, puedes probar esto en tu ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Esto se ejecuta chmod +xen el nombre de archivo de todos los .pyarchivos cuando los escribe. Mirando la lista de eventos ( :h events), no puedo encontrar un evento donde se cree un nuevo archivo, así que tuve que conformarme con ejecutarlo cada vez que se escribe.
  • La primera vez que chmodse aplica, el archivo cambia y vimle alertará sobre eso:

    "test.py" [New] 0L, 0C written
    W16: Warning: Mode of file "test.py" has changed since editing started
    See ":help W16" for more info.
    [O]K, (L)oad File:

    Intenté un par de trucos para hacerlo autoreadsolo para este cambio, pero no tuve suerte. Entonces tendrás que presionar Enterdos veces.


1

Cuando se inicia, el siguiente script cambia automáticamente los permisos de todos los archivos de un tipo determinado (extensión) en un directorio (una vez). Después de eso, la secuencia de comandos comprueba el directorio cada 5 segundos en busca de archivos recién agregados y cambia los permisos si el archivo es del tipo dado (en este caso, un .pyarchivo)

Tiene varias opciones: en este caso, hace que los archivos recién añadidos ejecutable, pero otras acciones son posibles también, como se define en la línea: command = "chmod +x". Además, puede definir (cambiar) en qué tipo de archivos (extensiones de idioma) se debe realizar la acción.

Cómo utilizar

Copie el script a continuación en un archivo vacío. Guárdelo como change_permission.pyy ejecútelo en segundo plano con el comando:

python3 <script> <folder_to_watch>

La secuencia de comandos

#!/usr/bin/env python3

import subprocess
import time
import sys

directory = sys.argv[1]
command = "chmod +x"; check_interval = 5; extensions = (".py")

def current_files():
    read = subprocess.check_output(["ls", directory]).decode("utf-8").strip()
    return [item for item in read.split("\n") if item[item.rfind("."):] in extensions]

initial_files = current_files()
for file in initial_files:
    subprocess.call(["/bin/bash", "-c", command+" "+directory+"/"+file])

while True:
    update = current_files()
    for file in update:
        if not file in initial_files:
            subprocess.call(["/bin/bash", "-c", command+" "+directory+"/"+file])  
    initial_files = update
    time.sleep(check_interval)

* Nota: si necesita privilegios de sudo, simplemente ejecute el script con sudo


1

Aquí hay información con algunos comandos que pueden ayudar, consulte http://ss64.com/bash/syntax-permissions.html

find . -type f -print0 | xargs -0 chmod 775 # change all file permissions in current directory

find . -type d -print0 | xargs -0 chmod 755 # change directory permissions

Puede usar el siguiente script de encabezado. Coloque mkscript.shen su $PATH. Ejecutar mkscript.shdesde el directorio de trabajo donde se almacenan los scripts de Python. El script crea información útil de encabezado, titula el script y lo hace ejecutable, y luego abre el editor elegido; en tu caso VIM.

Modifiqué mkscript.sh, producirá scripts con la extensión python*.py

Se ${PYTHON_VERSION}llama a la variable , por lo que PYTHON_VERSION="/usr/bin/python --version"se ha agregado al /etc/environmentarchivo. Echa un vistazo a https://help.ubuntu.com/community/EnvironmentVariables

#!/bin/bash -       
#title           :mkscript.sh
#description     :This script will make a header for a PYTHON script.
#author      :bgw
#date            :20111101
#version         :0.4    
#usage       :bash mkscript.sh
#notes           :Install Vim and Emacs to use this script.
#bash_version    :4.1.5(1)-release
#==============================================================================

today=$(date +%Y%m%d)
div=======================================

/usr/bin/clear

_select_title(){

    # Get the user input.
    printf "Enter a title: " ; read -r title

    # Remove the spaces from the title if necessary.
    title=${title// /_}

    # Convert uppercase to lowercase.
    title=${title,,}

    # Add .sh to the end of the title if it is not there already.
    [ "${title: -3}" != '.py' ] && title=${title}.py

    # Check to see if the file exists already.
    if [ -e $title ] ; then 
        printf "\n%s\n%s\n\n" "The script \"$title\" already exists." \
        "Please select another title."
        _select_title
    fi

}

_select_title

printf "Enter a description: " ; read -r dscrpt
printf "Enter your name: " ; read -r name
printf "Enter the version number: " ; read -r vnum

# Format the output and write it to a file.
printf "%-16s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%-16s%-8s\n\
%s\n\n\n" '#!/usr/bin/python -' '#title' ":$title" '#description' \
":${dscrpt}" '#author' ":$name" '#date' ":$today" '#version' \
":$vnum" '#usage' ":./$title" '#notes' ':' '#python_version' \
":${PYTHON_VERSION}" \#$div${div} > $title

# Make the file executable.
chmod +x $title

/usr/bin/clear

_select_editor(){

    # Select between Vim or Emacs.
    printf "%s\n%s\n%s\n\n" "Select an editor." "1 for Vim." "2 for Emacs."
    read -r editor

    # Open the file with the cursor on the twelth line.
    case $editor in
        1) vim +12 $title
            ;;
        2) emacs +12 $title &
            ;;
        *) /usr/bin/clear
           printf "%s\n%s\n\n" "I did not understand your selection." \
               "Press <Ctrl-c> to quit."
           _select_editor
            ;;
    esac

}

_select_editor
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.