Bir dizinin tamamını nasıl yürütülebilir hale getiririm?


15

Python komut dosyalarına adanmış bir klasörüm var.

Yazdığım her yeni python betiğinde chmod yapmaktan yoruldum.

Python betiği varsa, klasörümdeki her dosyayı çalıştırılabilir yapmanın bir yolu var mı?

Yeni bir .py betiği oluşturulduğunda kontrol eden bir betiğe sahip olmak ve yeni bir .py betiği varsa hemen orada çalıştırılabilir kılmak iyi olurdu.

  • Vim kullanıyorum.

Bu komut dosyalarını yazmak için ne kullanıyorsunuz? Bunu sizin için yapılandırmak vimveya emacsyapmak mümkün olabilir .
muru

Vim kullanıyorum. Ve bu mükemmel olurdu.
Dominici

dizinde alt klasörler var mı?
Jacob Vlijm

Alt klasörler yok, sadece scriptlerim.
Dominici

Yanıtlar:


10

Başka bir iyi seçenek Incron . Belirli bir konum için belirtilebilir koşullarla inotifikasyon üzerinde çalışır.

Bu klasörü izle diyebilirim, bir dosya oluşturduğunuzda bir komut çalıştırın.

Tıpkı bir örnek incrontab gibi ...

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

Benzer şekilde yol / dosya, .pygerekirse bir uzantıya göre filtrelenmesine izin vermek için bir bash komut dosyasına argümanlar olarak da kullanılabilir .


İnsanların teşekkür etmek için zaten cevaplanmış sorulara geri dönüp dönmediğinden emin değilim ... Burada yeniyim, kimin umurunda. Çok teţekkür ederim. Şu anda üzerinde çalıştığım her şey için incron kullanıyorum.
Dominici

Endişeye gerek yok, glade yararlı oldu. :) Proje biraz belirsiz, bu yüzden insanlarla paylaşmayı seviyorum. Her türlü otomasyonu otomatikleştirmek ve boru hattı oluşturmak için çok kullandım.
DivinusVox

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

/ Path / to / python / scripts / dir.py dizinindeki tüm geçerli dosyaları yürütülebilir yapar .

Açıkladığınız gibi bir otomatik aracın farkında değilim. Düzenleyicinizde bunu yapabilen bir makro olması mümkün olabilir, ancak kullandığım düzenleyiciyle değil. ;-)


4
işaretçiler için teşekkürler. OP özellikle python betikleri dedi, bu yüzden dahil ediyorum *.py. Ben de OP komut dosyalarının standart kullanıcı kimliği ait olduğunu varsayıyorum, bu yüzden ihtiyacını görmüyorum sudo. Hepinize iyi şanslar.
shellter

1

İlk adım olarak, bunu aşağıdakilerinizde deneyebilirsiniz ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Bu , onlara yazdığınızda chmod +xtüm .pydosyalar için dosya adında çalışır . Olaylar listesine ( :h events) baktığımda, yeni bir dosyanın oluşturulduğu bir olayı bulamıyorum , bu yüzden her yazıldığında çalıştırmak için yerleşmek zorunda kaldım.
  • İlk chmoduygulandığında dosya değişir ve vimsizi bu durumla ilgili uyaracaktır:

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

    autoreadSadece bu değişiklik için birkaç püf noktası denedim , ama şans yok. Yani Enteriki kez basmanız gerekecek .


1

Başlatıldığında, aşağıdaki komut dosyası bir dizindeki belirli bir türdeki (uzantı) tüm dosyaların izinlerini otomatik olarak değiştirir (bir kez). Bundan sonra komut kontrolleri dizini için her 5 saniyede yeni eklenen dosyalar ve izinlerini değiştirir eğer dosya Belirli bir türde (a, bu durumda .pydosyası)

Birkaç seçenek vardır: Bu durumda, yeni eklenen dosyalar çalıştırılabilir yapar, ama doğrultusunda tanımlanan diğer eylemler de mümkündür: command = "chmod +x". Ayrıca, eylemin ne tür dosyalar (dil uzantıları) yapılması gerektiğini tanımlayabilir (değiştirebilirsiniz).

Nasıl kullanılır

Aşağıdaki komut dosyasını boş bir dosyaya kopyalayın. Farklı kaydedin change_permission.pyve komutla arka planda çalıştırın:

python3 <script> <folder_to_watch>

Senaryo

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

* Not: sudo ayrıcalıklarına ihtiyacınız varsa, komut dosyasını sudo


1

İşte size yardımcı olabilecek birkaç komut içeren bazı bilgiler, 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

Aşağıdaki başlık komut dosyasını kullanabilirsiniz. İçine mkscript.shyerleştirin $PATH. mkscript.shPython komut dosyalarının depolandığı çalışma dizininden yürütme . Komut dosyası bazı yararlı başlık bilgileri oluşturur, komut dosyasını başlıklandırır ve çalıştırılabilir hale getirir ve ardından seçilen düzenleyiciyi açar; sizin durumunuzda VIM.

Değiştirdim mkscript.sh, python uzantısı ile komut dosyaları üretecek*.py

Değişken ${PYTHON_VERSION}çağrılır, bu nedenle dosyaya PYTHON_VERSION="/usr/bin/python --version"eklenir /etc/environment. Https://help.ubuntu.com/community/EnvironmentVariables adresine bir göz atın

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.