我有一个专门用于存放 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