ฉันจะทำให้ทั้งไดเร็กทอรีดำเนินการได้อย่างไร


14

ฉันมีโฟลเดอร์ทั้งหมดสำหรับสคริปต์หลาม

ฉันเหนื่อยกับการทำ chmod กับสคริปต์ python ใหม่ทุกตัวที่ฉันเขียน

มีวิธีที่จะทำให้ทุกไฟล์ในโฟลเดอร์ของฉันสามารถเรียกใช้งานได้หรือไม่ถ้ามันเป็นสคริปต์ไพ ธ อน

มันจะเป็นการดีถ้ามีสคริปต์ที่ตรวจสอบทุกครั้งที่มีการสร้างสคริปต์. py ใหม่และหากมีสคริปต์. py ใหม่ที่ทำให้สามารถเรียกใช้งานได้ทันที

  • ฉันใช้เสียงเรียกเข้า

คุณใช้อะไรในการเขียนสคริปต์เหล่านี้ มันจะเป็นไปได้ที่จะกำหนดค่าvimหรือemacsทำเพื่อคุณ
muru

ฉันใช้เสียงเรียกเข้า และนั่นจะสมบูรณ์แบบ
Dominici

มีโฟลเดอร์ย่อยในไดเรกทอรีหรือไม่
Jacob Vlijm

ไม่มีโฟลเดอร์ย่อยเพียงสคริปต์ของฉัน
Dominici

คำตอบ:


10

ตัวเลือกที่ดีอีกประการหนึ่งคือIncron มันทำงานกับ inotify กับเงื่อนไขที่ระบุสำหรับสถานที่ที่กำหนด

ดังนั้นฉันสามารถพูดดูโฟลเดอร์นี้เมื่อคุณเห็นไฟล์ที่สร้างขึ้นให้เรียกใช้คำสั่ง

เช่นเดียวกับตัวอย่างหน้า ...

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

เราสามารถใช้พา ธ / ไฟล์ในลักษณะเดียวกับอาร์กิวเมนต์ของสคริปต์ทุบตีเพื่ออนุญาตให้กรองตาม.pyส่วนขยายหากจำเป็น


ไม่แน่ใจว่าคนกลับมาตอบคำถามแล้วตอบว่าขอบคุณ ... แต่ต่อไป ฉันใหม่ที่นี่ใครสนใจ ขอบคุณมาก ๆ ฉันใช้ incron สำหรับทุกสิ่งที่ฉันกำลังทำอยู่ตอนนี้
Dominici

ไม่ต้องกังวลมันเป็นประโยชน์อย่างมาก :) โครงการนี้ค่อนข้างคลุมเครือดังนั้นฉันชอบแบ่งปันกับผู้อื่น ฉันใช้ประโยชน์จากมันอย่างเต็มที่เพื่อทำให้สิ่งต่าง ๆ เป็นไปโดยอัตโนมัติ
DivinusVox

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

จะทำให้การปฏิบัติการทั้งหมดในปัจจุบัน.pyไฟล์ในไดเรกทอรี/ เส้นทาง / เพื่อ / หลาม / scripts / dir

ฉันไม่ทราบเครื่องมืออัตโนมัติตามที่คุณอธิบาย อาจเป็นไปได้ที่จะมีมาโครในโปรแกรมแก้ไขของคุณที่สามารถทำได้ แต่ไม่ใช่กับโปรแกรมแก้ไขที่ฉันใช้ ;-)


4
ขอบคุณสำหรับคำแนะนำ OP กล่าวว่าสคริปต์ python โดยเฉพาะดังนั้นฉันจึงรวม*.pyไว้ด้วย sudoฉันยังสมมติว่าสคริปต์ตรวจการณ์เป็นเจ้าของโดยหมายเลขผู้ใช้มาตรฐานของเขาดังนั้นผมไม่เห็นความจำเป็นในการ โชคดีทุกคน.
shellter

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 $PATHดำเนินการmkscript.shจากไดเรกทอรีการทำงานที่จัดเก็บสคริปต์ของหลาม สคริปต์สร้างข้อมูลส่วนหัวที่มีประโยชน์ตั้งชื่อสคริปต์และทำให้สามารถเรียกใช้งานได้จากนั้นเปิดตัวแก้ไขที่เลือก ในกรณีของคุณ VIM

ฉันแก้ไขmkscript.shมันจะสร้างสคริปต์ด้วยส่วนขยายหลาม*.py

ตัวแปร${PYTHON_VERSION}ถูกเรียกใช้ดังนั้นPYTHON_VERSION="/usr/bin/python --version"ถูกเพิ่มเข้ากับ/etc/environmentไฟล์ ดูที่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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.