recursivamente chmod

5

Eu estava tentando chmod pastas e arquivos com:

find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;

Mas eu estava pensando:

  1. Como fazer isso em uma linha usando find e excluindo os diretórios . e ..

  2. Qual método é melhor, find -exec ou xargs ?

por user1538 07.09.2010 / 04:26

4 respostas

2

Sherlock tem (1), para (2) xargs é geralmente preferível, pois permite uma sintaxe mais razoável e menos sobrecarga de invocação de shell. Esteja ciente das opções -print0 e -0 para localizar e xargs, respectivamente, pois caminhos com espaços e caracteres especiais podem prejudicar os trabalhos.

Para uma corrida de uma só vez, a diferença realmente não deve importar a menos que você esteja chmodding uma árvore enorme. Se você fizer isso com freqüência suficiente para se formalizar em um script, eu usaria xargs.

    
por 07.09.2010 / 04:48
10

Está usando find ou xargs obrigatório?

Se não, você pode usar:

chmod -R u=rwX,go=rX *
    
por 07.09.2010 / 14:08
3

Você pode fazer isso com os argumentos nomeados para chmod:

 chmod u=rwX,go=rX {}

O capital X é a parte chave aqui que altera a permissão para executável somente se for um diretório. Consulte a página de manual para mais detalhes.

    
por 07.09.2010 / 04:35
3
find . -type d -exec chmod 755 {} + -or -type f -exec chmod 644 {} +

find ... -exec ... + é como find ... -exec ... \; , exceto que o comando é executado apenas uma vez por grande conjunto de arquivos correspondentes.

Era uma vez, find OPTIONS... -exec COMMAND... \; teve que agir em um arquivo de cada vez. Portanto, xargs foi inventado para agrupar ações para eficiência. Mas xargs apresentou sua própria parcela de problemas: espera que a entrada seja citada de maneira que find não possa produzir. Portanto, find OPTIONS... | xargs COMMAND... não é bom, a menos que você saiba que os nomes dos arquivos não contêm '"\ ou espaço em branco.

Em seguida, o GNU inventou find OPTIONS... -print0 | xargs -0 COMMAND... , o que permite que qualquer caractere apareça em um nome de arquivo. Mas demorou muito tempo para qualquer outra pessoa adotá-lo e, enquanto isso, Sun (eu acho) inventou find OPTIONS... -exec COMMAND... + , que faz o mesmo trabalho de agrupamento de xargs , sem as complicações adicionais (linha de comando mais longa, limite a um por find comando). Agora find ... -exec ... + é padrão (está em Unix único v3 ), e mais amplamente disponível que% código%. A menos que você tenha que manter a compatibilidade com um sistema Linux antigo, apenas esqueça xargs -0 .

    
por 07.09.2010 / 23:04