Como domino o comando find do UNIX?

11

Eu acho que estou bastante avançado no meu uso de encontrar, mas toda vez que eu usá-lo eu não posso para a vida de mim lembrar o método para fechar a opção -exec. Eu gasto muito tempo lendo toda vez que uso. Eu simplesmente não estou usando o suficiente ou esperando muito de mim mesmo? Vamos começar com um exemplo típico que me deixa frustrado.

A estrutura de diretórios possui arquivos com todas as permissões incorretas, arquivos ocultos, links simbólicos, etc. Quero alterar a propriedade para um valor razoável

find . -type f -exec chown username {} \;
find . -type d -exec chown username {} \;
find . -type d -exec chgrp usergroup {} \;
find . -type f -exec chgrp usergroup {} \;

(Perdoe-me se o final está para trás ... Eu olhei para ele uma hora atrás e ainda não tenho certeza)

Mas eu estou com medo de executá-lo por causa de montarias, links simbólicos, etc. Eu fiz o último jogo de chmod. * e tive que recorrer para cima de mim antes. Eu sei que -xdev irá abrir mão de partições cruzadas, mas não tenho certeza do que acontecerá com os arquivos que vivem dentro de diretórios que são links simbólicos.

Então, como alguém domina essa fera que pode matar arquivos cruciais?

Atualize as melhores sugestões abaixo e resuma:

  1. Ter um diretório de prática vinculado e montado em outros diretórios de prática.
  2. Use xargs em vez do comando exec não intuitivo.
  3. Use -exec echo {} para sanidade e segurança
  4. O ponto e vírgula é especial e você está escapando, portanto o caractere de escape é o primeiro
  5. O comando -or pode ajudá-lo a combinar critérios de seleção.

Estou um pouco confuso sobre o print0, mas xargs sempre foi um pouco difícil de entender, à primeira vista, prática que tento evitar.

    
por ojblass 22.06.2009 / 02:23

9 respostas

19

Bem, no que diz respeito à sintaxe -exec , você pode fazer como muitas pessoas, desistir e usar xargs :

find . -type f | xargs chown username

(ou a versão de arquivos com espaços e outras que não fazem sentido neles)

find . -type f -print0 | xargs -0 chown username

Ou, para tentar lembrar a coisa certa a fazer com o ponto-e-vírgula, o que você precisa detalhar é que você está usando um ponto-e-vírgula para terminar o comando que -exec é correndo, e você tem que escapar o ponto-e-vírgula porque tem um significado especial para bash . É por isso que é ponto e vírgula de barra invertida. Você parece ter a parte de substituição {} bem.

Quanto a matar arquivos e assim por diante, se você está executando algo grande e perigoso como o que você está falando, primeiro faça isso:

find . -type f -exec echo chown username {} \;

e revise os resultados. Este é basicamente um "dry run", onde você está vendo os comandos que seriam executados se você permitir. Definitivamente, uma boa prática. Não vai ajudar com o problema .* , mas você não sabe fazer isso agora. :)

    
por 22.06.2009 / 02:37
3

Estou surpreso que ninguém tenha mencionado a seguinte opção:

find . -type f -ok chown username {} \;

Esta sintaxe confirmará o comando antes de executá-lo. Funciona melhor se você espera que a sua correspondência seja um número relativamente pequeno de arquivos, porque ela solicitará cada um deles.

Algumas respostas mencionam xargs , mas com o GNU, isso também é desnecessário:

find . -type f -exec chown username {} \+

Observe que o + normalmente não precisa ser ignorado, mas é bom adotar o hábito de fazer isso de qualquer maneira.

    
por 22.06.2009 / 07:20
3

É para isso que o homem é: Pode ser difícil lembrar de coisas, é por isso que o comando * nix inclui páginas man. Você pode sempre verificar a seção ACTION da página man para um lembrete sobre a sintaxe: man find . Embora as páginas do manual possam parecer não amigáveis, uma vez que você seja bom em lê-las, elas são muito úteis.

Crie um front-end ou um wrapper: Quando eu queria melhorar no GNU Find, eu escrevi um front-end GUI para encontre que gera comandos de busca com python, glade e pygtk. Este é um bom exercício se você quiser conhecê-lo muito bem.

Tenha um diretório de prática: Por último, eu sempre tenho um diretório 'scrap' no meu diretório doméstico para jogar com comandos poderosos quando algo como 'echo' não o corta. Você pode usar a expansão do shell para criar rapidamente vários arquivos com algo como:

for i in {1..100}; do touch "$i"; done
    
por 22.06.2009 / 15:26
1

Você também pode combinar expressões de busca com os operadores '-e-' e '-or'. -e está implícito:

find . -type f -name "plainfile" ...

é o mesmo que

find . -type f -and -name "plainfile" ...

O operador or pode reduzir sua lista de 4 comandos para 2:

find . -type d -or -type f ...

E, finalmente, não relacionado a encontrar, mas chown também pode definir o grupo também. Então, lidando com espaços em nomes também acabamos com:

find . -type d -or -type f -exec chown username:usergroup '{}' \;
    
por 22.06.2009 / 07:29
0

Ao fechar, penso em usar; como com muitas linguagens de programação e depois escapá-lo. Apenas lembre-se de que é preciso escapar e isso chega até você facilmente.

    
por 22.06.2009 / 03:03
0

Dependendo da versão do anúncio que você está usando, há opções diferentes que podem ajudar você. O GNU find é provavelmente o mais poderoso e isso pode ajudá-lo com sua segunda pergunta (implícita)

Por exemplo - o comportamento padrão não é desreferenciar links simbólicos, mas você pode sobrescrever isso; e a opção -mount pára de encontrar os pontos de montagem

Procure nas páginas de manual locais

    
por 22.06.2009 / 03:53
0

Alguns argumentam que a opção xargs é mais rápida do que a opção -exec porque ele não executará o comando uma vez para cada arquivo, mas eu não me preocuparia com nada além de tarefas gigantescas que levassem um tempo não trivial.

Pessoalmente, eu costumo apenas executar o find sem exec

find /path/to/dir -name whatever

verifique se a saída está correta e, em seguida, execute meu comando nessa lista.

chown user:group 'find /path/to/dir -name whatever'
    
por 22.06.2009 / 04:19
0

Para alguns shells (não bash) escape {} para o comportamento adequado.

\{\} or '{}'

encontrar manual é bom para encontrar masterização.

    
por 22.06.2009 / 03:57
0

Antes de fazer algo como isso, certifique-se de que o diretório em que está executando este comando não esteja no mesmo sistema de arquivos que o / usr ou o / etc. (caso contrário, se eu tiver um link físico para / etc / passwd ou para / bin / sh no meu diretório inicial, você acabou de me dar a propriedade deles e, como efeito colateral, agora possuo a máquina).

Se você quiser recursar através de um diretório e chown todos os arquivos / diretórios, um simples

chown -Rh user: usuário do grupo de usuários /

fará isso. Faça certeza que você usa o -h ou o chown seguirá os links simbólicos.

    
por 23.06.2009 / 16:57