如何使整个目录可执行?

如何使整个目录可执行?

我有一个专门用于存放 python 脚本的文件夹。

我厌倦了对我编写的每个新的 Python 脚本执行 chmod。

如果它是 python 脚本,有没有办法使文件夹内的每个文件都可执行?

最好有一个脚本,它可以检查何时创建新的 .py 脚本,并且如果有新的 .py 脚本,则可以立即执行它。

  • 我使用 Vim。

答案1

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

.py将使目录中所有当前文件可执行/路径/到/python/脚本/目录

我不知道您描述的自动工具。您的编辑器中可能有一个宏可以做到这一点,但我使用的编辑器不行。;-)

答案2

另一个不错的选择是英科龙。它针对给定位置的可指定条件在 inotify 上工作。

所以我可以说观察这个文件夹,当你看到创建的文件时,运行一个命令。

仅作为 incrontab 的一个示例......

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

类似地,可以采用路径/文件作为 bash 脚本的参数,以便它.py在需要时按扩展名进行过滤。

答案3

以下是一些可能有帮助的命令的信息,请查看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。从存储 Python 脚本的工作目录中执行mkscript.sh。该脚本创建一些有用的标头信息,为脚本命名并使其可执行,然后打开所选编辑器;在您的例子中是 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

答案4

启动后,以下脚本会自动更改目录中给定类型(扩展名)的所有文件的权限(一次)。此后,脚本每 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

相关内容