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

31

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 exibir uma lista de pastas, em vez de chamar o chown várias vezes.

Além disso, haveria uma maneira de exibir 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.

josef.van.niekerk
fonte

Respostas:

43

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

chown 644 one two three

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

chown -R 644 !(cache)

Será suficiente.

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

shopt -s extglob

Consulte: Manual de Referência do Bash # Correspondência de Padrões

Dennis
fonte
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 outros aqui:

chown 644 one two three

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

chmod g+w `sed 's/ \// .\//' update-writable.txt` 
Chonez
fonte
2

regex para a vitória!

Usar find é a melhor maneira de pensar fora do regex que já pode existir em 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 nesse caso. Outra coisa triste de aprender ... como aprender chmod, chown, chgrp, et. al. não suporta a seleção / exclusão de vários arquivos / regex em si ...
A solução que encontrei:
/programming/19111067/regex-match-either-string-in-linux-find-command

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

portanto, não há 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 liner.

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

outros links e conteúdos meus que possam interessá-lo em suas viagens:
Vários petiscos - notas de korn bourne e amigos. - Site de Dave Horner

Felicidades.
--dave

Dave Horner
fonte
BEIJO vencer, mantenha-o simples e estúpido! não há necessidade de coisas complexas que ainda possam ser limpas e fáceis.
Al-Mothafar
2

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

Por exemplo, eu preciso que todos os arquivos .run baixados no pwd sejam alterados para executáveis:

chmod +x `ls *.run`
gat1
fonte