Comment puis-je rendre un répertoire entier exécutable?


14

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

J'en ai assez de faire chmod sur 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 place.

  • J'utilise Vim.

Qu'utilisez-vous pour écrire ces scripts? Il serait possible de configurer vimou emacsde faire cela pour vous.
muru

J'utilise vim. Et ce serait parfait.
Dominici

y a-t-il des sous-dossiers dans le répertoire?
Jacob Vlijm

Aucun sous-dossier juste mes scripts.
Dominici

Réponses:


10

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

Je peux donc dire regarder ce dossier, lorsque vous voyez un fichier créé, exécutez une commande.

Tout comme un exemple d'incrontab ...

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

On pourrait également utiliser le chemin / fichier comme arguments d'un script bash pour lui permettre de filtrer par .pyextensions si nécessaire.


Je ne sais pas si les gens reviennent déjà aux questions déjà répondues pour dire merci ... mais de toute façon. Je suis nouveau ici, peu importe. Merci beaucoup. J'utilise incron pour à peu près toutes les choses sur lesquelles je travaille en ce moment.
Dominici

Pas de soucis, clairière ça a été utile. :) Le projet est un peu obscur, donc j'aime le partager avec les gens. J'en ai fait grand usage pour automatiser et canaliser toutes sortes de choses.
DivinusVox

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

Rendra exécutable tous les .pyfichiers actuels dans le répertoire / chemin / vers / python / scripts / dir .

Je ne connais pas d'outil automatique comme vous le décrivez. Il pourrait être possible d'avoir une macro dans votre éditeur qui pourrait le faire, mais pas avec l'éditeur que j'utilise. ;-)


4
merci pour les pointeurs. L'OP a spécifiquement dit les scripts python, c'est pourquoi j'inclus *.py. Je suppose également que les scripts OP appartiennent à son ID utilisateur standard, donc je ne vois pas la nécessité de sudo. Bonne chance à tous.
shellter

1

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

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Cela s'exécute chmod +xsur le nom de fichier de tous les .pyfichiers lorsque vous y écrivez. En regardant la liste des événements ( :h events), je ne trouve pas d'événement où un nouveau fichier est créé, j'ai donc dû me contenter de courir à chaque fois qu'il est écrit.
  • La première fois que le chmodest appliqué, le fichier est modifié et vimvous en avertira:

    "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 faire autoreadjuste pour ce changement, mais pas de chance. Vous devrez donc appuyer Enterdeux fois.


1

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 les fichiers nouvellement ajoutés et modifie les autorisations si le fichier est du type donné (dans ce cas, un .pyfichier)

Il a quelques options: dans ce cas, il rend les fichiers exécutables nouvellement ajoutés, mais d' autres actions sont également possibles, tels que définis dans la ligne: command = "chmod +x". De plus, vous pouvez définir (modifier) ​​sur quel type de fichiers (extensions de langue) l'action doit être effectuée.

Comment utiliser

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

python3 <script> <folder_to_watch>

Le script

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

Voici quelques informations avec quelques commandes qui pourraient vous 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. Placer mkscript.shdans votre $PATH. Exécutez à mkscript.shpartir du répertoire de travail où les scripts python sont stockés. Le script crée des informations d'en-tête utiles, titre 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, elle a donc PYTHON_VERSION="/usr/bin/python --version"été ajoutée au /etc/environmentfichier. Jetez un œil à 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.