Як зробити весь каталог виконуваним?


15

У мене є ціла папка, присвячена сценаріям python.

Я втомився робити chmod над кожним новим сценарієм python, який я пишу.

Чи є спосіб зробити кожен файл у моїй папці виконуваним, якщо це сценарій python?

Було б непогано мати сценарій, який перевіряє кожен раз, коли створюється новий .py-скрипт, і якщо є новий .py-скрипт, зробіть його виконуваним прямо на місці.

  • Я використовую Vim.

Що ви використовуєте для написання цих сценаріїв? Можна було б налаштувати vimабо emacsзробити це для вас.
муру

Я використовую vim. І це було б ідеально.
Домінічі

чи є в каталозі підпапки?
Яків Влійм

Немає підпапок лише мої сценарії.
Домінічі

Відповіді:


10

Ще один хороший варіант - Incron . Він працює на ініціативу із визначеними умовами для даного місця.

Тож я можу сказати дивитися цю папку, коли ви бачите створений файл, виконайте команду.

Так само, як зразок введення інформації ...

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

Можна аналогічно використовувати шлях / файл як аргументи до bash-скрипту, щоб дозволити йому фільтрувати за .pyрозширеннями, якщо це потрібно.


Не впевнений, чи повернуться люди до вже відповідей на запитання, щоб сказати подяку ... але все одно. Я новачок тут, кого хвилює. Дякую тобі велику увагу Я використовую incron для майже всіх речей, над якими зараз працюю.
Домінічі

Не хвилюйтесь, поляна це була корисною. :) Проект є дещо незрозумілим, тому мені подобається ділитися ним з людьми. Я чудово використовував його для автоматизації та розробки всіляких речей.
DivinusVox

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

Зробить виконувані всі поточні .pyфайли в каталозі / шлях / до / python / script / dir .

Я не знаю про автоматичний інструмент, як ви описуєте. У вашому редакторі може бути макрос, який міг би це зробити, але не з редактором, який я використовую. ;-)


4
спасибі за покажчики ОП спеціально сказав сценарії пітона, тому я і включаю *.py. Я також припускаю, що сценарії OPs належать його стандартному користувальницькому ID, тому я не бачу потреби в цьому 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у своєму $PATH. Виконайте mkscript.shз робочого каталогу, де зберігаються скрипти python. Сценарій створює корисну інформацію заголовка, називає сценарій та робить його виконуваним, а потім відкриває обраний редактор; у вашому випадку VIM

Я змінив mkscript.sh, він створить сценарії з розширенням python*.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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.