Bagaimana cara membuat seluruh direktori dapat dieksekusi?

14

Saya memiliki seluruh folder yang didedikasikan untuk skrip python.

Saya bosan melakukan chmod pada setiap skrip python baru yang saya tulis.

Apakah ada cara untuk membuat setiap file di dalam folder saya dapat dieksekusi jika itu adalah skrip python?

Akan menyenangkan untuk memiliki skrip yang memeriksa setiap kali skrip .py baru dibuat dan jika ada skrip .py baru membuatnya dapat dieksekusi di sana saat itu juga.

  • Saya menggunakan Vim.
Dominici
sumber
Apa yang Anda gunakan untuk menulis skrip ini? Mungkin untuk mengkonfigurasi vimatau emacsmelakukan itu untuk Anda.
muru
Saya menggunakan vim. Dan itu akan sempurna.
Dominici
apakah ada subfolder dalam direktori?
Jacob Vlijm
Tidak ada subfolder hanya skrip saya.
Dominici

Jawaban:

10

Pilihan bagus lainnya adalah Incron . Ini bekerja pada inotify dengan kondisi spesifik untuk lokasi tertentu.

Jadi bisa saya katakan tonton folder ini, ketika Anda melihat file dibuat, jalankan perintah.

Sama seperti sampel depan ...

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

Orang juga bisa menggunakan path / file sebagai argumen untuk skrip bash untuk memungkinkannya untuk memfilter berdasarkan .pyekstensi jika diperlukan.

DivinusVox
sumber
Tidak yakin apakah orang pernah kembali ke pertanyaan yang sudah dijawab untuk mengucapkan terima kasih ... tapi toh. Saya baru di sini, siapa yang peduli. Terima kasih banyak. Saya menggunakan incron untuk hampir semua hal yang saya kerjakan saat ini.
Dominici
Jangan khawatir, rawa itu bermanfaat. :) Proyek ini agak tidak jelas, jadi saya suka berbagi dengan orang-orang. Saya telah memanfaatkannya untuk mengotomatisasi dan menyalurkan segala macam hal.
DivinusVox
5
chmod +x /path/to/python/scripts/dir/*.py 

Akan membuat semua .pyfile saat ini dapat dieksekusi di direktori / path / ke / python / script / dir .

Saya tidak mengetahui adanya alat otomatis seperti yang Anda gambarkan. Dimungkinkan untuk memiliki makro di editor Anda yang bisa melakukan ini, tetapi tidak dengan editor yang saya gunakan. ;-)

kerang
sumber
4
terima kasih untuk petunjuknya. OP secara khusus mengatakan skrip python, jadi itu sebabnya saya memasukkan *.py. Saya juga berasumsi bahwa skrip OP dimiliki oleh userID standarnya, jadi saya tidak melihat perlunya sudo. Semoga beruntung untuk semua.
kerang
1

Sebagai langkah pertama, Anda bisa mencoba ini di ~/.vimrc:

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Ini berjalan chmod +xpada nama file untuk semua .pyfile ketika Anda menulis kepada mereka. Melihat daftar peristiwa ( :h events), saya tidak dapat menemukan acara di mana file baru dibuat, jadi saya harus puas menjalankannya setiap kali ditulis.
  • Pertama kali chmodditerapkan, file diubah, dan vimakan mengingatkan Anda akan hal itu:

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

    Saya mencoba beberapa trik untuk membuatnya autoreadhanya untuk perubahan ini, tetapi tidak berhasil. Jadi, Anda harus menekan Enterdua kali.

muru
sumber
1

Ketika dimulai, skrip di bawah ini secara otomatis mengubah izin semua file dari jenis tertentu (ekstensi) dalam direktori (satu kali). Setelah itu, skrip memeriksa direktori setiap 5 detik untuk file yang baru ditambahkan , dan mengubah izin jika file tersebut dari tipe yang diberikan (dalam hal ini .pyfile)

Ini memiliki beberapa pilihan: dalam kasus ini, itu membuat file baru ditambahkan executable, tapi tindakan lain yang mungkin juga, sebagaimana didefinisikan dalam baris: command = "chmod +x". Selain itu, Anda dapat menentukan (mengubah) pada jenis file apa (ekstensi bahasa) tindakan yang harus dilakukan.

Cara Penggunaan

Salin skrip di bawah ini ke file kosong. Simpan sebagai change_permission.pydan jalankan di latar belakang dengan perintah:

python3 <script> <folder_to_watch>

Naskah

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

* Catatan: jika Anda memerlukan hak sudo, cukup jalankan skrip dengan sudo

Yakub Vlijm
sumber
1

Berikut adalah beberapa info dengan beberapa perintah yang mungkin membantu, lihat 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

Anda dapat menggunakan skrip tajuk berikut. Tempatkan mkscript.shdi $PATH. Jalankan mkscript.shdari direktori kerja tempat skrip python disimpan. Script membuat beberapa info header yang berguna, judul skrip dan membuatnya dieksekusi, dan kemudian buka editor yang dipilih; dalam kasus Anda VIM.

Saya memodifikasi mkscript.sh, itu akan menghasilkan skrip dengan ekstensi python*.py

Variabel ${PYTHON_VERSION}dipanggil, jadi PYTHON_VERSION="/usr/bin/python --version"telah ditambahkan ke /etc/environmentfile. Lihat 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
sumber