Wie mache ich ein gesamtes Verzeichnis ausführbar?

13

Ich habe einen ganzen Ordner für Python-Skripte.

Ich bin es leid, jedes neue Python-Skript, das ich schreibe, mit chmod zu bearbeiten.

Gibt es eine Möglichkeit, jede Datei in meinem Ordner ausführbar zu machen, wenn es sich um ein Python-Skript handelt?

Es wäre schön, ein Skript zu haben, das überprüft, wann immer ein neues .py-Skript erstellt wird, und wenn es ein neues .py-Skript gibt, kann es direkt vor Ort ausgeführt werden.

  • Ich benutze Vim.
Dominici
quelle
Womit schreiben Sie diese Skripte? Es wäre möglich , dies für Sie zu konfigurieren vimoder emacszu tun.
muru
Ich benutze Vim. Und das wäre perfekt.
Dominici
Gibt es Unterordner im Verzeichnis?
Jacob Vlijm
Keine Unterordner, nur meine Skripte.
Dominici

Antworten:

10

Eine weitere gute Option ist Incron . Es arbeitet an Inotify mit vorgebbaren Bedingungen für einen bestimmten Ort.

Also kann ich sagen, beobachten Sie diesen Ordner, wenn Sie eine Datei erstellt sehen, führen Sie einen Befehl aus.

Nur als Beispiel Incrontab ...

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

Man könnte den Pfad / die Datei auch als Argumente für ein Bash-Skript verwenden, damit es .pybei Bedarf nach Erweiterungen filtern kann.

DivinusVox
quelle
Ich bin mir nicht sicher, ob die Leute jemals auf bereits beantwortete Fragen zurückkommen, um sich zu bedanken ... aber trotzdem. Ich bin neu hier, wen interessiert das? Ich danke Ihnen vielmals. Ich benutze incron für so ziemlich alle Dinge, an denen ich gerade arbeite.
Dominici
Keine Sorge, Lichtung, es war nützlich. :) Das Projekt ist etwas dunkel, deshalb teile ich es gerne mit anderen. Ich habe es großartig genutzt, um alle möglichen Dinge zu automatisieren und zu leiten.
DivinusVox
5
chmod +x /path/to/python/scripts/dir/*.py 

Macht alle aktuellen .pyDateien im Verzeichnis / path / to / python / scripts / dir ausführbar .

Mir ist kein Auto-Tool bekannt, wie Sie es beschreiben. Möglicherweise befindet sich in Ihrem Editor ein Makro, mit dem dies möglich ist, jedoch nicht mit dem von mir verwendeten Editor. ;-)

Shellter
quelle
4
danke für die hinweise. Das OP sagte speziell Python-Skripte, deshalb schließe ich ein *.py. Ich gehe auch davon aus, dass die OPs-Skripte im Besitz seiner Standardbenutzer-ID sind, daher sehe ich keine Notwendigkeit dafür sudo. Allen viel Glück.
Shellter
1

Als ersten Schritt können Sie dies in folgenden Schritten versuchen ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Dies wird chmod +xfür alle .pyDateien mit dem Dateinamen ausgeführt , wenn Sie darauf schreiben. Wenn :h eventsich mir die Liste der Ereignisse ( ) anschaue, kann ich kein Ereignis finden, bei dem eine neue Datei erstellt wird. Daher musste ich mich damit zufrieden geben, dass sie jedes Mal ausgeführt wird, wenn sie geschrieben wird.
  • Beim erstmaligen chmodAnwenden von wird die Datei geändert und Sie vimwerden darauf hingewiesen:

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

    Ich habe ein paar Tricks ausprobiert, um es autoreadnur für diesen Wechsel zu schaffen, aber kein Glück. Sie müssen also Enterzweimal drücken .

muru
quelle
1

Nach dem Start ändert das folgende Skript automatisch die Berechtigungen aller Dateien eines bestimmten Typs (Erweiterung) in einem Verzeichnis (einmalig). Danach überprüft das Skript das Verzeichnis alle 5 Sekunden auf neu hinzugefügte Dateien und ändert die Berechtigungen, wenn die Datei vom angegebenen Typ ist (in diesem Fall eine .pyDatei).

Es hat ein paar Optionen: in diesem Fall macht es die neu hinzugefügten Dateien ausführbar, aber auch andere Aktionen sind auch möglich, wie in der Linie definiert: command = "chmod +x". Außerdem können Sie festlegen (ändern), für welche Art von Dateien (Spracherweiterungen) die Aktion ausgeführt werden soll.

Wie benutzt man

Kopieren Sie das folgende Skript in eine leere Datei. Speichere es als change_permission.pyund starte es im Hintergrund mit dem Befehl:

python3 <script> <folder_to_watch>

Das Drehbuch

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

* Hinweis: Wenn Sie Sudo-Berechtigungen benötigen, führen Sie einfach das Skript mit sudo

Jacob Vlijm
quelle
1

Hier einige Informationen mit einigen Befehlen, die hilfreich sein könnten: 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

Sie können das folgende Header-Skript verwenden. Platzieren Sie mkscript.shin Ihrem $PATH. Führen Sie mkscript.shdas Programm aus dem Arbeitsverzeichnis aus, in dem die Python-Skripte gespeichert sind. Das Skript erstellt einige nützliche Header-Informationen, benennt das Skript und macht es ausführbar. Anschließend wird der ausgewählte Editor geöffnet. in deinem Fall VIM.

Ich habe es modifiziert mkscript.sh, es wird Skripte mit der Python-Erweiterung erzeugen*.py

Die Variable ${PYTHON_VERSION}heißt, wurde also PYTHON_VERSION="/usr/bin/python --version"der /etc/environmentDatei hinzugefügt . Besuchen Sie 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
Aus dem Gitter
quelle