Como faço para tornar um diretório inteiro executável?

11

Eu tenho uma pasta inteira dedicada a scripts python.

Estou cansado de fazer chmod em todo novo script python que escrevo.

Existe uma maneira de tornar cada arquivo dentro da minha pasta executável se for um script python?

Seria bom ter um script que verifica sempre que um novo script .py é criado e, se houver um novo script .py, torná-lo executável ali mesmo.

  • eu uso o Vim.
por Dominici 06.11.2014 / 04:58

5 respostas

10

Outra boa opção é Incron . Ele funciona no inotify com condições especificáveis para um determinado local.

Então, posso dizer que observe esta pasta, quando você ver um arquivo criado, execute um comando.

Assim como uma amostra incrontab ...

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

Poder-se-ia usar o caminho / arquivo como argumentos para um script bash para permitir filtrar por .py extensões, se necessário.

    
por DivinusVox 06.11.2014 / 08:33
4
chmod +x /path/to/python/scripts/dir/*.py 

Tornará executáveis todos os arquivos .py atuais no diretório / path / to / python / scripts / dir .

Não conheço uma ferramenta automática como você descreve. Pode ser possível ter uma macro no seu editor que possa fazer isso, mas não com o editor que uso. ; -)

    
por shellter 06.11.2014 / 05:13
1

Como primeiro passo, você pode tentar isso no seu ~/.vimrc :

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Isso executa chmod +x no nome do arquivo para todos os arquivos .py quando você escreve para eles. Olhando para a lista de eventos ( :h events ), não consigo encontrar um evento onde um novo arquivo é criado, então eu tive que me contentar com a execução cada vez que é escrito para.
  • Na primeira vez em que o chmod for aplicado, o arquivo será alterado e vim alertará você sobre isso:

    "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:
    

    Eu tentei alguns truques para torná-lo autoread apenas para essa mudança, mas sem sorte. Então você terá que pressionar Enter duas vezes.

por muru 06.11.2014 / 06:29
1

Quando iniciado, o script abaixo altera automaticamente as permissões de todos os arquivos de um determinado tipo (extensão) em um diretório (uma vez). Depois disso, o script verifica o diretório a cada 5 segundos para arquivos recém-adicionados , e altera as permissões se o arquivo for do tipo dado (nesse caso, .py arquivo)

Tem algumas opções: neste caso, torna os arquivos recém-adicionados executáveis, mas outras ações também são possíveis, conforme definido na linha: command = "chmod +x" . Além disso, você pode definir (alterar) em que tipo de arquivos (extensões de linguagem) a ação deve ser executada.

Como usar

Copie o script abaixo em um arquivo vazio. Salve-o como change_permission.py e execute-o em segundo plano pelo comando:

python3 <script> <folder_to_watch>

O script

#!/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)

* Nota: se você precisar de privilégios sudo, simplesmente execute o script com sudo

    
por Jacob Vlijm 06.11.2014 / 08:10
1

Aqui estão algumas informações com alguns comandos que podem ajudar, confira o link

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

Você pode usar o seguinte script de cabeçalho. Coloque mkscript.sh no seu $PATH . Execute mkscript.sh do diretório de trabalho em que os scripts python estão armazenados. O script cria algumas informações de cabeçalho úteis, intitula o script e o torna executável e, em seguida, abre o editor escolhido; no seu caso VIM.

Eu modifiquei mkscript.sh , ele produzirá scripts com a extensão do python *.py

A variável ${PYTHON_VERSION} é chamada, então PYTHON_VERSION="/usr/bin/python --version" foi adicionado ao arquivo /etc/environment . Dê uma olhada no link

#!/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
    
por Off Grid 04.12.2015 / 21:54