Как мне сделать весь каталог исполняемым?

14

У меня есть целая папка, посвященная сценариям Python.

Я устал делать chmod на каждом новом скрипте Python, который я пишу.

Есть ли способ сделать каждый файл внутри моей папки исполняемым, если это скрипт на python?

Было бы неплохо иметь скрипт, который проверяет всякий раз, когда создается новый скрипт .py, и если есть новый скрипт .py, он сразу же исполняется.

  • Я использую Vim.
Доминичи
источник
Что вы используете для написания этих сценариев? Можно было бы настроить vimили emacsсделать это для вас.
Муру
Я использую vim. И это было бы прекрасно.
Доминики
есть ли в каталоге подпапки?
Джейкоб Влейм
Нет подпапок, только мои сценарии.
Доминики

Ответы:

10

Еще один хороший вариант - Incron . Это работает на inotify с определенными условиями для данного местоположения.

Так что я могу сказать смотреть эту папку, когда вы видите созданный файл, запустите команду.

Так же, как образец incrontab ...

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

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

DivinusVox
источник
Не уверен, что люди когда-нибудь вернутся к уже отвеченным вопросам, чтобы сказать спасибо ... но все равно. Я новичок здесь, кого это волнует. Большое вам спасибо Я использую incron для почти всех вещей, над которыми я сейчас работаю.
Доминики
Не беспокойтесь, поляна была полезна. :) Проект немного неясен, поэтому мне нравится делиться им с людьми. Я очень хорошо использовал его для автоматизации и передачи всех видов вещей.
DivinusVox
5
chmod +x /path/to/python/scripts/dir/*.py 

Сделает исполняемыми все текущие .pyфайлы в каталоге / path / to / python / scripts / dir .

Я не знаю об автоинструменте, как вы описываете. Возможно, в вашем редакторе есть макрос, который мог бы это делать, но не с редактором, который я использую. ;-)

shellter
источник
4
спасибо за указатели. ОП специально сказал Python скрипты, поэтому я включаю *.py. Я также предполагаю, что сценарии OPs принадлежат его стандартному userID, поэтому я не вижу необходимости в этом 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из рабочего каталога, в котором хранятся скрипты 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
От сетки
источник