Como faço para executar um diretório inteiro?

14

Eu tenho uma pasta inteira dedicada a scripts python.

Estou cansado de fazer chmod em todos os novos scripts python que escrevo.

Existe uma maneira de tornar todos os arquivos dentro da minha pasta executáveis ​​se for um script python?

Seria bom ter um script que verifique sempre que um novo script .py for criado e se houver um novo script .py o torne executável ali mesmo.

  • Eu uso o Vim.
Dominici
fonte
O que você usa para escrever esses scripts? Seria possível configurar vimou emacsfazer isso por você.
Muru
Eu uso o vim. E isso seria perfeito.
Dominici
existem subpastas no diretório?
Jacob Vlijm
Sem subpastas apenas meus scripts.
Dominici

Respostas:

10

Outra boa opção é o Incron . Ele trabalha na inotificação com condições especificáveis ​​para um determinado local.

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

Assim como uma amostra incrontab ...

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

Da mesma forma, pode-se usar o caminho / arquivo como argumentos para um script bash para permitir a filtragem por .pyextensões, se necessário.

DivinusVox
fonte
Não tenho certeza se as pessoas voltam para as perguntas já respondidas para agradecer ... mas mesmo assim. Eu sou novo aqui, quem se importa. Muito obrigada. Estou usando o incron para praticamente todas as coisas em que estou trabalhando agora.
Dominici
Não se preocupe, clareira tem sido útil. :) O projeto é meio obscuro, então eu gosto de compartilhá-lo com as pessoas. Eu fiz um ótimo uso para automatizar e canalizar todo tipo de coisas.
DivinusVox
5
chmod +x /path/to/python/scripts/dir/*.py 

Tornará executáveis ​​todos os .pyarquivos atuais no diretório / caminho / para / python / scripts / dir .

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

shellter
fonte
4
obrigado pelos ponteiros. O OP disse especificamente scripts python, e é por isso que eu incluo *.py. Também estou assumindo que os scripts dos OPs pertencem ao seu userID padrão, portanto não vejo a necessidade sudo. Boa sorte a todos.
shellter 6/11/14
1

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

autocmd BufWritePost *.py silent execute "! chmod +x %"
  • Isso é executado chmod +xno nome do arquivo para todos os .pyarquivos quando você os escreve. Observando a lista de eventos ( :h events), não consigo encontrar um evento em que um novo arquivo seja criado, portanto tive que me contentar em executar cada vez que ele fosse gravado.
  • Na primeira vez em que chmodé aplicado, o arquivo é alterado e vimo alertará 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 fazer isso autoreadapenas para essa mudança, mas sem sorte. Então você terá que pressionar Enterduas vezes.

muru
fonte
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 em busca de arquivos adicionados recentemente e altera as permissões se o arquivo for do tipo especificado (nesse caso, um .pyarquivo)

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

Como usar

Copie o script abaixo em um arquivo vazio. Salve-o como change_permission.pye 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, basta executar o script com sudo

Jacob Vlijm
fonte
1

Aqui estão algumas informações com alguns comandos que podem ajudar, consulte 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

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

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

A variável ${PYTHON_VERSION}é chamada e, portanto PYTHON_VERSION="/usr/bin/python --version", foi adicionada ao /etc/environmentarquivo. Dê uma olhada em 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
Fora da grade
fonte