Aplicando permissões diferentes aos arquivos vs. diretórios

0

Sunny respondeu à pergunta acima em este post , A resposta foi dada como

No need for scripts.

// Directories:

find . -type d -exec chmod XXX {} \;

// Files:

find . -type f -exec chmod XXX {} \;

Por favor, você pode explicar isso em linguagem leiga?

Eu realmente não gosto de% inexplicável {} e \ de marcação e não ligo muito para o ; !

Estou tentando aprender o Linux cli / bash / shell, etc., para encontrar respostas e, na maioria das vezes, ele está funcionando bem, exceto quando o acima acontece.

    
por Community 18.05.2014 / 13:50

4 respostas

4

O {} é um espaço reservado que representa os arquivos que encontram correspondências. É assim que você diz ao comando que é passado para o argumento exec quais arquivos são encontrados.

O ; termina o comando que está sendo usado para o argumento exec. O \ é apenas para escapar do ; , portanto ele não é analisado pelo shell de execução ( ; é normalmente usado para separar vários comandos a serem executados sequencialmente). Você poderia facilmente citá-lo de alguma outra maneira:

find . -type d -exec chmod XXX '{} ;'
find . -type f -exec chmod XXX '{} ;'

Você também pode, alternativamente, usar um + em vez de um; Isso fará com que o find inclua cada correspondência em uma lista e as transmita para um subprocesso (em vez de gerar um novo processo filho para executar o comando no argumento exec em cada correspondência). (Nota: se você tiver um número muito grande de correspondências, usar + pode resultar em um erro sobre o comando ser muito longo).

find . -type d -exec chmod XXX {} +
find . -type f -exec chmod XXX {} +
    
por 18.05.2014 / 14:45
1

. = o diretório atual, ou seja. pesquise o diretório atual e os diretórios abaixo dele. Para pesquisar diretórios base, use /home . Para pesquisar em seu diretório home, use ~/ . Para pesquisar o diretório do usuário "foo", use ~foo/ . Para pesquisar tudo da raiz para baixo, use / .

NB!: As permissões se aplicam! Se você não tem o direito de decadir em um determinado diretório (como o diretório pessoal de outro usuário), então find também não pode fazê-lo! O usuário root não tem uma limitação tão estúpida, mas "com grande poder vem uma grande responsabilidade" também.

-type d|f = Diz para procurar arquivos de um certo "tipo", por exemplo. arquivo, diretório, socket, symbolic-link, named-pipe, ... Um f especifica que o tipo que você está procurando é um arquivo, enquanto d especifica que você deseja que find retorne diretórios.

Normalmente, find apenas listará os arquivos que encontrar, esta é a diretiva -print implícita. Aqui, no entanto, queremos encontrar para executar um comando (aqui chmod ) nos arquivos / diretórios que encontrar. Para fazer isso, podemos usar as diretivas -exec ou -ok . -ok perguntará primeiro "sim" ou "não" antes de executar o comando.

O comando a ser executado começa logo após -exec e continua até que find encontre ; (ponto-e-vírgula). Infelizmente, o ponto-e-vírgula tem significado especial para o shell também ( bash e outros) - ele é usado pelo shell para agrupar comandos juntos em uma linha (por exemplo, command1 ; command2 ). Portanto, devemos "citar" o ponto-e-vírgula para que o shell não "veja" antes de find . O shell aceita três formas de cotação: Aspas duplas ("...") e simples ('...') são normalmente usadas para seqüências de caracteres - poderíamos usar para citar o ponto-e-vírgula. No entanto, quando você deseja citar apenas um único caractere como este, é mais comum usar a terceira forma de citar - uma barra invertida (\). O resultado é o \; . (Se você colocar o seu find -command em um arquivo - ex. Faz um script - você pode frequentemente renunciar a \; e usar apenas o ; , porque o shell não expande um script da mesma maneira que ele a linha de comando.)

Geralmente, o comando que queremos que find execute precisará do nome de arquivo find encontrado. {} é usado como espaços reservados para o nome do arquivo encontrado. Muitas vezes é uma boa idéia colocar o espaço reservado entre aspas - "{}" - para garantir que os nomes de arquivos que contêm espaços sejam tratados como um único nome de arquivo pelo comando.

Para os arquivos, descobri que chmod u=rw,go=r {} ou chmod u=rw,go= {} funciona melhor, enquanto os diretórios devem usar chmod u=rwx,go=rx {} ou chmod u=rwx,go= {} (dependendo do seu nível de paranoia).

    
por 19.05.2014 / 15:50
1

I really dislike unexplained {} and \ markup and don't care much for the ; either!

Em alternativa, se o {} e o \; são excessivamente problemáticos, existe uma abordagem alternativa. Além disso, essa abordagem manipula espaços no nome do arquivo melhor que a fórmula find ... -exec.

find . -type d -print0 | xargs -0 chmod MASK
find . -type f -print0 | xargs -0 chmod MASK

O -print0 para o comando find cria uma lista de sequências terminadas em null. O xargs processa a lista, com o -0 indicando que ele deve ser dividido na cadeia terminada com nulo.

Além disso, em algumas situações, essa formulação é mais rápida que o argumento -exec para o comando find. Há alguma discussão aqui: link

Também é possível que o -print0 seja apenas Linux, em oposição ao Unix em geral.

    
por 26.03.2015 / 19:51
0

Deixe-me colocar alguns detalhes sobre o \; :

O delimitador \; para o comando -exec fará com que find inicie um novo processo para cada arquivo encontrado. Agora imagine rodar isso em uma árvore de diretórios com alguns 100.000 arquivos ...

Se você executar comandos como chmod XXX ... , que pode manipular / many / files em uma execução, você se sairá muito melhor com

find <base> <conditions> -exec chmod xxx {} +

+ permite encontrar linhas de comando maiores, reduzindo drasticamente o número de processos que precisam ser lançados. Além disso, não precisa de \ : -)

    
por 19.05.2014 / 16:11