मैं पूरी निर्देशिका को कैसे निष्पादित कर सकता हूं?


14

मेरे पास एक संपूर्ण फ़ोल्डर है जो अजगर लिपियों के लिए समर्पित है।

मैं हर नई अजगर स्क्रिप्ट पर चामोद करने से थक गया हूं जो मैं लिखता हूं।

क्या मेरे फ़ोल्डर के अंदर हर फ़ाइल को निष्पादन योग्य बनाने का एक तरीका है अगर यह एक पायथन स्क्रिप्ट है?

एक स्क्रिप्ट का होना अच्छा होगा, जब भी कोई नई .py स्क्रिप्ट बनाई जाती है और अगर कोई नई .py स्क्रिप्ट है, तो उसे मौके पर ही निष्पादित किया जा सकता है।

  • मैं विम का उपयोग करता हूं।

आप इन लिपियों को लिखने के लिए क्या प्रयोग करते हैं? यह आपके लिए कॉन्फ़िगर करना vimया emacsकरना संभव होगा ।
मूरू

मैं विम का उपयोग करता हूं। और यह एकदम सही होगा।
डोमिनिकी

क्या निर्देशिका में सबफ़ोल्डर हैं?
जैकब व्लिजम

कोई सबफ़ोल्डर सिर्फ मेरी स्क्रिप्ट नहीं।
डोमिनिकी

जवाबों:


10

एक और अच्छा विकल्प इंक्रॉन है । यह किसी दिए गए स्थान के लिए निर्दिष्ट शर्तों के साथ inotify पर काम करता है।

इसलिए मैं कह सकता हूं कि आप इस फ़ोल्डर को देख सकते हैं, जब आप बनाई गई फ़ाइल देखते हैं, तो एक कमांड चलाते हैं।

बस एक नमूना incrontab के रूप में ...

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

.pyयदि आवश्यक हो तो एक्सटेंशन द्वारा फ़िल्टर करने की अनुमति देने के लिए एक bash स्क्रिप्ट के तर्क के रूप में पथ / फ़ाइल का उपयोग किया जा सकता है ।


यकीन नहीं होता कि लोग कभी भी धन्यवाद कहने के लिए पहले से ही सवालों के जवाब देने आए ... लेकिन फिर भी। मैं यहां नया हूं, जो परवाह करता है। बहुत बहुत धन्यवाद। मैं अभी बहुत सारी चीजों का उपयोग कर रहा हूं, जो मैं अभी काम कर रहा हूं।
डोमिनिकी

कोई चिंता नहीं, ग्लेड यह उपयोगी रहा है। :) परियोजना अस्पष्ट है, इसलिए मुझे इसे लोगों के साथ साझा करना पसंद है। मैंने सभी प्रकार की चीजों को स्वचालित और पाइपलाइन करने के लिए इसका बहुत उपयोग किया है।
डिवाइनवूक्स

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

.pyनिर्देशिका / पथ / से / अजगर / स्क्रिप्ट / डीआईआर में सभी वर्तमान फ़ाइलों को निष्पादन योग्य बना देगा ।

जैसा कि आप वर्णन करते हैं, मुझे एक ऑटो-टूल के बारे में पता नहीं है। आपके संपादक में एक मैक्रो होना संभव है जो ऐसा कर सकता है, लेकिन मेरे द्वारा उपयोग किए जाने वाले संपादक के साथ नहीं। ;-)


4
संकेत के लिए धन्यवाद। ओपी ने विशेष रूप से अजगर लिपियों को कहा, इसलिए मैं इसमें शामिल हूं *.py। मैं यह भी मान रहा हूं कि ओपी लिपियों का स्वामित्व उनके मानक यूजरआईडी के पास है, इसलिए मुझे इसकी आवश्यकता नहीं है sudo। आप सभी को शुभकामनायें।
शेल्टर

1

पहले कदम के रूप में, आप अपने में यह कोशिश कर सकते हैं ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • यह chmod +xसभी .pyफ़ाइलों के लिए फ़ाइलनाम पर चलता है जब आप उन्हें लिखते हैं। घटनाओं की सूची ( :h events) को देखते हुए, मुझे ऐसी घटना नहीं मिल सकती है जहां एक नई फ़ाइल बनाई जाती है, इसलिए मुझे हर बार इसे लिखने के लिए चलाना होगा।
  • पहली बार chmodलागू होने पर, फ़ाइल बदल जाती है, और vimआपको इसके लिए सचेत करेगा:

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

    मैंने autoreadइस बदलाव के लिए इसे करने के लिए कुछ कोशिशें कीं , लेकिन कोई किस्मत नहीं। तो आपको Enterदो बार प्रेस करना होगा ।


1

जब आरंभ किया जाता है, तो नीचे दी गई स्क्रिप्ट स्वचालित रूप से किसी निर्देशिका (एक समय) में किसी दिए गए प्रकार (एक्सटेंशन) की सभी फ़ाइलों की अनुमतियों को बदल देती है। उसके बाद, स्क्रिप्ट नई जोड़ी गई फ़ाइलों के लिए निर्देशिका को हर 5 सेकंड में जांचती है , और अनुमतियाँ बदलती हैं यदि फ़ाइल दिए गए प्रकार की है (इस मामले में एक .pyफ़ाइल)

इसके कुछ विकल्प हैं: इस मामले में, यह नई जोड़ी गई फ़ाइलों को निष्पादन योग्य बनाता है, लेकिन अन्य क्रियाएं भी संभव हैं, जैसा कि लाइन में परिभाषित किया गया है command = "chmod +x":। इसके अतिरिक्त, आप परिभाषित (परिवर्तन) कर सकते हैं कि किस प्रकार की फ़ाइलों (भाषा एक्सटेंशन) पर कार्रवाई की जानी चाहिए।

कैसे इस्तेमाल करे

नीचे दी गई स्क्रिप्ट को एक खाली फ़ाइल में कॉपी करें। इसे सहेजें change_permission.pyऔर कमांड द्वारा पृष्ठभूमि में चलाएं:

python3 <script> <folder_to_watch>

लिपी

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

* नोट: यदि आप sudo विशेषाधिकारों की जरूरत है, बस स्क्रिप्ट के साथ चलाते हैं sudo


1

यहाँ कुछ आदेशों के साथ कुछ जानकारी है जो मदद कर सकती है, 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

आप निम्नलिखित हेडर स्क्रिप्ट का उपयोग कर सकते हैं। mkscript.shअपने में जगह $PATHmkscript.shकार्यशील निर्देशिका से निष्पादित करें जहां अजगर स्क्रिप्ट संग्रहीत हैं। स्क्रिप्ट कुछ उपयोगी हेडर जानकारी बनाता है, स्क्रिप्ट को शीर्षक देता है और इसे निष्पादन योग्य बनाता है, और फिर चुने गए संपादक को खोलता है; आपके मामले में वी.आई.एम.

मैंने संशोधित किया mkscript.sh, यह अजगर विस्तार के साथ स्क्रिप्ट का उत्पादन करेगा*.py

चर ${PYTHON_VERSION}को कहा जाता है, इसलिए फ़ाइल PYTHON_VERSION="/usr/bin/python --version"में जोड़ा गया है /etc/environmentHttps://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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.