Como posso chmod / chown uma lista específica de arquivos?

22

Eu quero escrever um script .sh para configurar algumas permissões de pasta, mas me pergunto se posso executar algo como:

chown -644 ./one;/two;/three

para mostrar uma lista de pastas, em vez de chamar o chown várias vezes.

Além disso, há uma maneira de criar uma lista de arquivos e excluir alguns outros, como, por exemplo:

chown -R -664 ./*;!./cache

Espero que minhas pseudo linhas de comando façam sentido.

    
por josef.van.niekerk 29.01.2013 / 10:19

4 respostas

32

Quase todas as ferramentas Unix aceitam uma lista de arquivos como argumentos não opcionais. Como de costume, os diferentes argumentos precisam ser separados por espaço:

chown 644 one two three

No seu segundo exemplo, se você estiver usando o Bash, um simples

chown -R 644 !(cache)

será o suficiente.

Essa abordagem exige correspondência estendida de padrões. Se estiver desativado, você pode ativá-lo com

shopt -s extglob

Veja: Manual de Referência da Bash # Correspondência de Padrões

    
por 29.01.2013 / 10:26
4

Faça uma lista de nomes de arquivos em mod-these.txt e execute:

chmod g+w 'cat mod-these.txt'

ou use o método descrito por outras pessoas aqui:

chown 644 one two three

ou vá para a cidade com a primeira opção, mas manipule cada linha no arquivo (neste exemplo: substitua "/" (com espaço em branco antes) por "./"):

chmod g+w 'sed 's/ \// .\//' update-writable.txt' 
    
por 29.01.2016 / 07:17
2

regex para ganhe!

usar o find é a melhor maneira que posso pensar fora do uso do regex que talvez já exista no seu shell específico ou no aplicativo que você está usando. Primeiro, tentei:

touch one&touch two &touch three&find -name "one|two|three" -exec chown -644 {} \;

Mas, você descobrirá que o pipe não funciona neste caso. Outra coisa triste de aprender ... como aprender chmod, chown, chgrp, et. al. não suporta seleção / exclusão multi-file / regex ...
A solução que encontrei: link

find \( -name one -o -name two -o -name three \) -exec chown -644 {} \;

Então, não muito regex para a vitória, mas pelo menos temos uma maneira de injetar uma lista de arquivos nos argumentos de um programa em um único liner.

você notará que precisa escapar dos meta-caracteres () e da adição do parâmetro -o para cada nome adicional ...

outros links e conteúdo de mim que podem lhe interessar ao longo de suas viagens: Vários petiscos - notas de kour bourne e amigos. - Site de Dave Horner

Felicidades.
--dave

    
por 04.01.2014 / 00:36
0

Se os arquivos que você deseja modificar estiverem em um diretório, você pode usá-los com o padrão necessário.

por exemplo. Preciso que todos os arquivos .run baixados no pwd sejam alterados para executáveis:

chmod +x 'ls *.run'
    
por 21.11.2017 / 16:10