web-dev-qa-db-fra.com

Comment créer un répertoire entier?

J'ai un dossier entier dédié aux scripts python.

J'en ai assez de faire chmod à chaque nouveau script python que j'écris.

Existe-t-il un moyen de rendre chaque fichier de mon dossier exécutable s’il s’agit d’un script python?

Ce serait bien d'avoir un script qui vérifie chaque fois qu'un nouveau script .py est créé et s'il y a un nouveau script .py le rendre exécutable sur-le-champ.

  • J'utilise Vim.
12
Dominici

Une autre bonne option est Incron . Il fonctionne avec des conditions spécifiables pour un emplacement donné.

Donc, je peux dire regarder ce dossier, quand vous voyez un fichier créé, lancez une commande.

Juste comme un exemple incrontab ...

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

De même, on pourrait utiliser le chemin/fichier comme argument d’un script bash pour lui permettre de filtrer par extension .py si nécessaire.

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

Rendra exécutable tous les fichiers .py actuels du répertoire / path/to/python/scripts/dir.

Je ne suis pas au courant d'un outil automatique comme vous le décrivez. Il serait peut-être possible d’avoir une macro dans votre éditeur, mais pas avec l’éditeur que j’utilise. ;-)

4
shellter

Dans un premier temps, vous pouvez essayer ceci dans votre ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Ceci exécute chmod +x sur le nom du fichier pour tous les fichiers .py lorsque vous leur écrivez. En regardant la liste des événements (:h events), je ne trouve pas un événement dans lequel un fichier nouvea est créé. J'ai donc dû me contenter de l'exécuter chaque fois qu'il était écrit.
  • La première fois que chmod est appliqué, le fichier est modifié et vim vous avertit de ce qui suit:

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

    J'ai essayé quelques astuces pour le rendre autoread juste pour ce changement, mais sans succès. Donc, vous devrez appuyer sur Enter deux fois.

1
muru

Une fois lancé, le script ci-dessous modifie automatiquement les autorisations de tous les fichiers d'un type donné (extension) dans un répertoire (une fois). Après cela, le script vérifie le répertoire toutes les 5 secondes pour fichiers récemment ajoutés, et modifie les autorisations if le fichier est du type donné (dans ce cas, un fichier .py)

Il a quelques options: dans ce cas, il rend les fichiers nouvellement ajoutés exécutables, mais d'autres actions sont également possibles, comme défini dans la ligne: command = "chmod +x". En outre, vous pouvez définir (modifier) ​​le type de fichiers (extensions de langage) sur lequel l'action doit être effectuée.

Comment utiliser

Copiez le script ci-dessous dans un fichier vide. Enregistrez-le sous change_permission.py et exécutez-le en arrière-plan avec la commande suivante:

python3 <script> <folder_to_watch>

Le scénario

#!/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)

* Remarque: si vous avez besoin des privilèges Sudo, exécutez simplement le script avec Sudo

1
Jacob Vlijm

Voici quelques informations avec quelques commandes qui pourraient aider, consultez 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

Vous pouvez utiliser le script d'en-tête suivant. Placez mkscript.sh dans votre $PATH. Exécutez mkscript.sh à partir du répertoire de travail dans lequel les scripts python sont stockés. Le script crée des informations d’en-tête utiles, intitule le script et le rend exécutable, puis ouvre l’éditeur choisi; dans votre cas, VIM.

J'ai modifié mkscript.sh, il produira des scripts avec l'extension python _ *.py

La variable ${PYTHON_VERSION} est appelée, donc PYTHON_VERSION="/usr/bin/python --version" a été ajouté au fichier /etc/environment. Regardez 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
1
Off Grid