Jak zrobić cały katalog wykonywalny?

14

Mam cały folder poświęcony skryptom Pythona.

Mam dość robienia chmod na każdym nowym skrypcie Pythona, który piszę.

Czy istnieje sposób, aby każdy plik w moim folderze był wykonywalny, jeśli jest to skrypt Pythona?

Byłoby miło mieć skrypt, który sprawdza, ilekroć jest tworzony nowy skrypt .py, a jeśli jest nowy skrypt .py, sprawia, że ​​jest on wykonywalny natychmiast.

  • Używam Vima.
Dominici
źródło
Czego używasz do pisania tych skryptów? Możliwe byłoby skonfigurowanie vimlub emacswykonanie tego za Ciebie.
muru
Używam vima. I to byłoby idealne.
Dominici,
czy w katalogu są podfoldery?
Jacob Vlijm,
Żadnych podfolderów tylko moje skrypty.
Dominici,

Odpowiedzi:

10

Inną dobrą opcją jest Incron . Działa na inotify z określonymi warunkami dla danej lokalizacji.

Mogę powiedzieć, że obejrzyj ten folder, gdy zobaczysz plik utworzony, uruchom polecenie.

Tak jak próbka incrontab ...

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

Podobnie można użyć ścieżki / pliku jako argumentów skryptu bash, aby w .pyrazie potrzeby umożliwić filtrowanie według rozszerzeń.

DivinusVox
źródło
Nie jestem pewien, czy ludzie kiedykolwiek wrócą do odpowiedzi na pytania, aby podziękować ... ale w każdym razie. Jestem tu nowy, kogo to obchodzi. Dziękuję bardzo za cholerstwo. Używam incron do prawie wszystkich rzeczy, nad którymi teraz pracuję.
Dominici,
Nie martw się, polana przydała się. :) Projekt jest niejasny, więc lubię dzielić się nim z ludźmi. Świetnie go wykorzystałem, aby zautomatyzować i potokować różne rzeczy.
DivinusVox,
5
chmod +x /path/to/python/scripts/dir/*.py 

Sprawi, że wszystkie .pypliki w katalogu / path / to / python / scripts / dir będą wykonywalne .

Nie opisuję automatycznego narzędzia. Może być możliwe posiadanie makra w twoim edytorze, które mogłoby to zrobić, ale nie w edytorze, którego używam. ;-)

łobuz
źródło
4
dzięki za wskazówki. OP konkretnie powiedział skrypty python, więc dlatego dołączam *.py. Zakładam również, że skrypty OP są własnością jego standardowego identyfikatora użytkownika, więc nie widzę takiej potrzeby sudo. Powodzenia wszystkim.
shellter
1

Jako pierwszy krok możesz wypróbować to w ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • To uruchamia chmod +xnazwę pliku dla wszystkich .pyplików, gdy do nich piszesz. Patrząc na listę zdarzeń ( :h events), nie mogę znaleźć zdarzenia, w którym tworzony jest nowy plik, więc musiałem zadecydować o uruchomieniu za każdym razem, gdy jest zapisywany.
  • Po pierwszym chmodzastosowaniu plik zostanie zmieniony i vimwyświetli ostrzeżenie:

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

    Próbowałem kilku sztuczek, aby zrobić to autoreadtylko dla tej zmiany, ale bez powodzenia. Będziesz musiał nacisnąć Enterdwa razy.

muru
źródło
1

Po zainicjowaniu poniższy skrypt automatycznie zmienia uprawnienia wszystkich plików danego typu (rozszerzenia) w katalogu (jeden raz). Następnie skrypt sprawdza katalog co 5 sekund pod kątem nowo dodanych plików i zmienia uprawnienia, jeśli plik jest danego typu (w tym przypadku .pyplik)

Jest kilka opcji: w tym przypadku, to sprawia, że nowo dodane pliki wykonywalne, ale inne działania są możliwe też, jak określono w linii: command = "chmod +x". Dodatkowo możesz zdefiniować (zmienić), jakiego rodzaju pliki (rozszerzenia językowe) należy wykonać.

Jak używać

Skopiuj poniższy skrypt do pustego pliku. Zapisz go jako change_permission.pyi uruchom w tle za pomocą polecenia:

python3 <script> <folder_to_watch>

Scenariusz

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

* Uwaga: jeśli potrzebujesz uprawnień sudo, po prostu uruchom skrypt za pomocą sudo

Jacob Vlijm
źródło
1

Oto kilka informacji z kilkoma poleceniami, które mogą pomóc, sprawdź 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

Możesz użyć następującego skryptu nagłówka. Umieść mkscript.shw swoim $PATH. Wykonaj mkscript.shz katalogu roboczego, w którym przechowywane są skrypty python. Skrypt tworzy użyteczne informacje nagłówkowe, tytułuje skrypt i umożliwia jego wykonanie, a następnie otwiera wybrany edytor; w twoim przypadku VIM.

Zmodyfikowałem mkscript.sh, będzie produkować skrypty z rozszerzeniem Pythona*.py

Zmienna ${PYTHON_VERSION}jest wywoływana, dlatego PYTHON_VERSION="/usr/bin/python --version"została dodana do /etc/environmentpliku. Zajrzyj na 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
Off Grid
źródło