ディレクトリ全体を実行可能にする方法は?


14

pythonスクリプト専用のフォルダー全体があります。

私が書くすべての新しいpythonスクリプトでchmodを実行するのはうんざりです。

pythonスクリプトの場合、フォルダー内のすべてのファイルを実行可能にする方法はありますか?

新しい.pyスクリプトが作成されるたびにチェックし、新しい.pyスクリプトがある場合はその場で実行可能にするスクリプトがあると便利です。

  • Vimを使用しています。

これらのスクリプトの記述には何を使用しますか?あなたのためにvimそれを設定したりすることは可能でしょうemacs
ムル14年

私はvimを使用しています。そしてそれは完璧でしょう。
ドミニシ14年

ディレクトリにサブフォルダーはありますか?
ジェイコブVlijm 14年

スクリプトだけのサブフォルダーはありません。
ドミニシ14年

回答:


10

別の良いオプションはIncronです。特定の場所の指定可能な条件でinotifyで動作します。

ですから、このフォルダーを監視し、作成されたファイルを確認したら、コマンドを実行します。

サンプルのincrontabと同じように...

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

同様に、パス/ファイルをbashスクリプトの引数として使用して、.py必要に応じて拡張子でフィルタリングできるようにすることもできます。


人々が感謝を言うためにすでに答えられた質問に戻ってくるかどうかはわかりません...しかし、とにかく。私はここで新しい、気にしています。本当におめでとうございます。私が今取り組んでいるほとんどすべてのことにincronを使用しています。
ドミニシ14年

心配いりません、それは役に立ちました。:)プロジェクトはちょっとわかりにくいので、人々と共有するのが好きです。私はあらゆる種類のものを自動化し、パイプライン化するためにそれを大いに活用しました。
DivinusVox 14年

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

.pyディレクトリ/ path / to / python / scripts / dir内のすべての現在のファイルを実行可能にします。

あなたが説明しているように、私は自動ツールを知りません。これを行うことができるマクロをエディターに持つことは可能かもしれませんが、私が使用しているエディターではできません。;-)


4
ポインタをありがとう。OPは具体的にpythonスクリプトを指定したため、を含めます*.py。また、OPsスクリプトは彼の標準のuserIDによって所有されていると想定しているため、の必要性はわかりませんsudo。皆さんお元気で。
シェルター14年

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この変更のためだけにいくつかのトリックを試しましたが、運はありませんでした。そのため、Enter2回押す必要があります。


1

開始されると、以下のスクリプトは、ディレクトリ内の特定のタイプ(拡張子)のすべてのファイルのアクセス許可を自動的に変更します(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ます$PATHmkscript.shPythonスクリプトが保存されている作業ディレクトリから実行します。スクリプトはいくつかの有用なヘッダー情報を作成し、スクリプトにタイトルを付けて実行可能にし、選択したエディターを開きます。あなたの場合、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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.