Come posso rendere eseguibile un'intera directory?


14

Ho un'intera cartella dedicata agli script Python.

Sono stanco di fare chmod su ogni nuovo script Python che scrivo.

C'è un modo per rendere eseguibile ogni file nella mia cartella se si tratta di uno script Python?

Sarebbe bello avere uno script che controlli ogni volta che viene creato un nuovo script .py e se c'è un nuovo script .py renderlo eseguibile proprio lì sul posto.

  • Io uso Vim.

Cosa usi per scrivere questi script? Sarebbe possibile configurarlo vimo emacsfarlo per te.
muru,

Uso vim. E sarebbe perfetto.
Dominici,

ci sono sottocartelle nella directory?
Jacob Vlijm,

Nessuna sottocartella, solo i miei script.
Dominici,

Risposte:


10

Un'altra buona opzione è Incron . Funziona su inotify con condizioni specificabili per una determinata posizione.

Quindi posso dire guarda questa cartella, quando vedi un file creato, esegui un comando.

Proprio come un esempio di incrontab ...

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

Si potrebbe usare allo stesso modo il percorso / file come argomenti per uno script bash per permettergli di filtrare per .pyestensione se necessario.


Non sono sicuro se le persone torneranno alle domande già risposte per ringraziare ... ma comunque. Sono nuovo qui, chi se ne frega. Grazie mille. Sto usando incron per praticamente tutte le cose su cui sto lavorando in questo momento.
Dominici,

Nessun problema, radura è stato utile. :) Il progetto è piuttosto oscuro, quindi mi piace condividerlo con le persone. Ne ho fatto un ottimo uso per automatizzare e eseguire il pipeline di ogni genere di cose.
DivinusVox,

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

Renderà eseguibili tutti i .pyfile correnti nella directory / path / to / python / scripts / dir .

Non sono a conoscenza di uno strumento automatico come descrivi. Potrebbe essere possibile avere una macro nel tuo editor in grado di farlo, ma non con l'editor che uso. ;-)


4
grazie per i puntatori. L'OP ha detto specificamente script Python, quindi è per questo che includo *.py. Suppongo anche che gli script OP siano di proprietà del suo ID utente standard, quindi non ne vedo la necessità sudo. Buona fortuna a tutti.
shellter

1

Come primo passo, potresti provare questo nel tuo ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Questo viene eseguito chmod +xsul nome file per tutti i .pyfile quando si scrive su di essi. Guardando l'elenco degli eventi ( :h events), non riesco a trovare un evento in cui viene creato un nuovo file, quindi ho dovuto accontentarmi di eseguirlo ogni volta che viene scritto.
  • La prima volta che chmodviene applicato, il file viene modificato e vimti avviserà che:

    "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:

    Ho provato un paio di trucchi per farlo autoreadsolo per questo cambiamento, ma senza fortuna. Quindi dovrai premere Enterdue volte.


1

Quando avviato, lo script seguente modifica automaticamente le autorizzazioni di tutti i file di un determinato tipo (estensione) in una directory (una volta). Successivamente, lo script controlla la directory ogni 5 secondi per i file appena aggiunti e modifica le autorizzazioni se il file è del tipo specificato (in questo caso un .pyfile)

Ha un paio di opzioni: in questo caso, rende i file aggiunti eseguibile, ma altre azioni sono possibili anche, come definito nella linea: command = "chmod +x". Inoltre, è possibile definire (modificare) il tipo di file (estensioni di lingua) che l'azione deve essere eseguita.

Come usare

Copia lo script seguente in un file vuoto. Salvalo come change_permission.pyed eseguilo in background con il comando:

python3 <script> <folder_to_watch>

Il copione

#!/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: se hai bisogno dei privilegi di sudo, esegui semplicemente lo script con sudo


1

Ecco alcune informazioni con alcuni comandi che potrebbero aiutare, controlla 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

È possibile utilizzare il seguente script di intestazione. Metti mkscript.shnel tuo $PATH. Eseguire mkscript.shdalla directory di lavoro in cui sono memorizzati gli script Python. Lo script crea alcune utili informazioni di intestazione, lo titolo e lo rende eseguibile, quindi apre l'editor scelto; nel tuo caso VIM.

Ho modificato mkscript.sh, produrrà script con l'estensione Python*.py

La variabile ${PYTHON_VERSION}viene chiamata, quindi PYTHON_VERSION="/usr/bin/python --version"è stata aggiunta al /etc/environmentfile. Dai un'occhiata 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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.