Preciso excluir .git
da minha find
pesquisa. Para conseguir isso, estou usando o -path ./.git -prune
switch:
$ find . -path ./.git -prune -o \( -type f -o -type l -o -type d \) | grep '.git'
./.git
No entanto, mesmo que isso ignore o conteúdo do diretório .git, ele lista o próprio diretório. Funciona quando adiciono-path ./.git -prune -o -print -a
find . -path ./.git -prune -o -print -a \( -type f -o -type l -o -type d \) | grep '.git'
Por que isso é necessário? Eu pensei que os dois comandos deveriam ter a mesma saída. A segunda sintaxe é bastante feia.
-print
, caso contrário, o implícito-print
se aplica a toda a condiçãoRespostas:
A
man
página parafind
fornece:Portanto, no primeiro exemplo, não
-path ./.git -prune
é falso e, portanto, a ação padrão (-print
) não seria chamada, portanto a linha é impressa.fonte
Eu estava confuso sobre o motivo pelo qual os diretórios podados também estavam sendo impressos pelo
find
comando e alguns outros detalhes intricados de como-prune
funcionava, mas consegui descobrir isso com alguns exemplos.Para executar os exemplos abaixo, crie os seguintes diretórios e arquivos.
Para criar essa estrutura:
Agora use find para procurar diretórios nomeados
aa
. Não tem problema aqui.Procure por todos os diretórios que não sejam aa e obtemos o diretório atual
.
e./bb
, o que também faz sentido.Até aqui tudo bem, mas quando usamos
-prune
, find retorna o diretório que estamos removendo, o que inicialmente me confundiu, porque eu esperava que ele retornasse todos os outros diretórios e não o que estava sendo podado.O motivo pelo qual ele retorna o diretório que está sendo removido é explicado, não na
-prune
seção das páginas de manual, conforme indicado na resposta do Timo , mas naEXPRESSIONS
seção:o que significa que, como a expressão corresponde ao
aa
nome do diretório, a expressão será avaliada como verdadeira e será impressa porque find adiciona implicitamente a-print
no final de todo o comando. No-print
entanto, ele não adicionará um se você propositadamente adicionar a ação-o -print
até o fim:Aqui, o comando find NÃO adiciona mais um implícito
-print
e, portanto, o diretório que estamos removendo (aa
) não será impresso.Então, finalmente, se adicionarmos uma cláusula que procura por arquivos com um padrão de nome de arquivo
file*
após-o
, você deve colocar a-print
no final dessa segunda cláusula, como esta:O motivo pelo qual isso funciona é o mesmo: se você não inserir um
-print
na segunda cláusula, como não há outra ação além da-prune
ação, o find adicionará um-print
automaticamente no fim do comando, fazendo com que a-prune
cláusula imprima o diretório removido:Em geral, você precisa colocar o
-print
comando na segunda cláusula. Se você colocá-lo no meio, como o pôster original, não funcionará corretamente, pois os arquivos que serão removidos serão impressos imediatamente e a segunda cláusula não terá a chance de escolher os arquivos que deseja:Infelizmente, o pôster original entendeu errado o comando acima, colocando o
-print
no lugar errado. Pode ter funcionado para o seu caso específico, mas não funciona no caso geral.Existem milhares de pessoas que têm dificuldades para entender como
-prune
funciona. Afind
página de manual deve ser atualizada para evitar a confusão mundial sem fim sobre esse comando.fonte
find-4.6.0
) diz: "Se a expressão inteira não contiver ações além de -une ou -print, -print será executada em todos os arquivos para os quais a expressão inteira é verdadeira". Mas funciona como você descreve.da
man
página,Então, pode ser que você possa usar:
Isso não lista o
.git
diretório.para especificar um nome de arquivo, você pode fazer o seguinte:
Observe o
,
operador de vírgula.fonte
Aqui está uma alternativa rápida e suja:
Simplesmente não consigo me lembrar
find
da sintaxe complexa ...fonte