Eu acho que estou bastante avançado no meu uso do find, mas toda vez que eu o uso, não consigo lembrar o método para fechar a opção -exec. Passo bastante tempo lendo cada vez que o uso. Simplesmente não estou usando o suficiente ou esperando muito de mim? 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. Desejo 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á ao contrário ... olhei para ele há uma hora e ainda não tenho certeza)
Mas estou com medo de executá-lo por causa de montagens, links simbólicos etc. Fiz a melhor brincadeira com o chmod. * E tive que recorrer a mim antes. Eu sei que o -xdev renunciará ao atravessar partições, 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 a remoção das melhores sugestões abaixo e o resumo:
- Tenha um diretório de prática vinculado e montado em outros diretórios de prática.
- Use xargs em vez do comando exec não-intuitivo.
- Use -exec echo {} para sanidade e segurança
- O ponto e vírgula é especial e você está escapando, portanto o caractere de escape é o primeiro
- O comando -or pode ajudá-lo a combinar critérios de seleção.
Estou um pouco confuso com o print0, mas o xargs sempre foi um pouco difícil de entender, à primeira vista, na prática que tento evitar.
fonte
Respostas:
Bem, no que diz respeito à
-exec
sintaxe, você pode gostar de muitas pessoas, desistir e usarxargs
:(ou a versão arquivos com espaços e outras bobagens-neles-seguras)
Ou, para tentar se lembrar da 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 finalizar o comando que
-exec
está sendo executado e você precisa escapar do ponto-e-vírgula porque possui significado parabash
. É por isso que é ponto e vírgula com barra invertida. Você parece ter a{}
parte de substituição correta.Quanto a matar arquivos e assim por diante, se você estiver executando algo grande e perigoso como o que está falando, primeiro faça o seguinte:
e revise os resultados. Isso é basicamente uma "execução a seco", na qual você vê os comandos que seriam executados se você deixasse. Definitivamente uma boa prática. Não vai ajudar com o
.*
problema, mas você sabe que não deve fazer isso agora. :)fonte
Estou surpreso que ninguém ainda tenha mencionado a seguinte opção:
Essa sintaxe confirmará o comando antes de executá-lo. Funciona melhor se você espera que sua correspondência seja um número relativamente pequeno de arquivos, porque será solicitado um para cada um.
Algumas respostas mencionam
xargs
, mas com o GNU acham que isso também é desnecessário:Observe que o + normalmente não precisa ser escapado, mas é bom adquirir o hábito de fazê-lo de qualquer maneira.
fonte
É para isso que o homem serve: Pode ser difícil lembrar de coisas, é por isso que o comando * nix inclui páginas de manual. Você pode apenas verificar sempre a seção de ação da página do homem para um lembrete sobre a sintaxe:
man find
. Embora as páginas de manual possam parecer pouco amigáveis, uma vez que você é bom em lê-las, elas são muito úteis.Crie um Front-End ou Wrapper: Quando quis melhorar o GNU find, escrevi um front end da GUI para o find que gera comandos find 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 fim, eu sempre tenho um diretório 'scrap' no meu diretório home para tocar com comandos poderosos quando algo como 'eco' não é suficiente. Você pode usar a expansão do shell para criar rapidamente um monte de arquivos com algo como:
fonte
Você também pode combinar expressões de localização com operadores '- e' e '- ou'. -e está implícito:
é o mesmo que
O operador or pode reduzir sua lista de 4 comandos para 2:
E, finalmente, não relacionado a encontrar, mas o chown também pode definir o grupo. Então, lidando com espaços nos nomes, acabamos com:
fonte
Ao fechar, apenas penso em usar; como em muitas linguagens de programação e depois escapando. Lembre-se de que é preciso escapar e isso chega a você com bastante facilidade.
fonte
Dependendo da versão do achado que você está usando, existem diferentes opções que podem ajudá-lo. A descoberta do GNU é provavelmente a mais poderosa 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 substituí-lo; e a opção -mount para encontrar os pontos de montagem
Procure nas páginas de manual locais
fonte
Alguns argumentam que a opção xargs é mais rápida que a opção -exec, porque não executará o comando uma vez para cada arquivo, mas eu não me preocuparia com nada, exceto trabalhos maciços que demoram um tempo não trivial.
Pessoalmente, eu normalmente apenas executo find sem exec
verifique se a saída parece correta e execute meu comando nessa lista.
fonte
Em algumas conchas (não no bash), escape {} para um comportamento adequado.
O manual find é bom para dominar o find.
fonte
Antes de fazer algo assim, verifique se o diretório em que este comando está sendo executado não está no mesmo sistema de arquivos que / usr ou / etc. (caso contrário, se eu tiver um link físico para / etc / passwd ou / bin / sh no meu diretório pessoal, você acabou de me dar posse desses e, como efeito colateral, agora possuo a máquina).
Se você deseja recursar através de um diretório e exibir todos os arquivos / diretórios, um simples
chown -Rh user: usergroup user /
vai fazer isso. Certifique- se de usar o -h ou o chown seguirá os links simbólicos.
fonte