Excluindo diretórios em find

Excluindo diretórios em find

findé sempre um mistério completo para mim sempre que o uso; Eu só quero excluir tudo abaixo /mnt(estou no bash no Ubuntu 20.04 no WSL, então não quero que ele pesquise no espaço do Windows) da minha pesquisa, mas findapenas cometi erros nesses diretórios, me ignorando completamente. Encontrei a sintaxe desta página.https://stackoverflow.com/questions/4210042/how-to-exclude-a-directory-in-find-commande tentei todas as variações - todas falharam.

sudo find / -name 'git-credential-manager*' -not -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '/mnt/*'
sudo find / -name 'git-credential-manager*' ! -path '*/mnt/*'

Quando faço isso, ele comete erros /mnte gera erros (o que é realmente frustrante, pois a sintaxe acima parece clara e a sintaxe da página stackoverflow parece correta):

find: ‘/mnt/d/$RECYCLE.BIN/New folder’: Permission denied
find: ‘/mnt/d/$RECYCLE.BIN/S-1-5-18’: Permission denied

Alguém pode me mostrar como parar findde ignorar minhas opções de exclusão de diretório?

Responder1

Find's -pathnão exclui caminhos, significa "não reportar nenhuma correspondência cujo nome corresponda a este caminho". Ele ainda descerá aos diretórios e os pesquisará. O que você quer é -prune(de man find):

       -prune True;  if  the file is a directory, do not descend into it.  If
              -depth is given, then -prune has no  effect.   Because  -delete
              implies  -depth, you cannot usefully use -prune and -delete to‐
              gether.  For example, to skip the directory src/emacs  and  all
              files  and  directories  under  it,  and print the names of the
              other files found, do something like this:
                  find . -path ./src/emacs -prune -o -print

Então você quer:

sudo find / -path '/mnt/*' -prune -name 'git-credential-manager*' 

Embora, com base no que você está tentando excluir, possa ser mais fácil de usar -mount(GNU find) ou -xdev(outros):

De man find:

-mountNão desça diretórios em outros sistemas de arquivos. Um nome alternativo para -xdev, para compatibilidade com algumas outras versões do find.

Então:

sudo find / -mount -name 'git-credential-manager*' 

Responder2

Não ignora a opção. O -pathpredicado é avaliado para cada arquivo encontrado e, para os arquivos dessa árvore, ele simplesmente falha. Isso não afeta o modo como finda árvore de diretórios caminha, e você pode ter algo find . ! -path "./foo/*" -o -name '*.txt'parecido com tudo o que está fora foo, mas também com os arquivos correspondentes *.txtdentro dela.

OPágina de manual do GNUé bastante claro sobre o que fazer aqui, use -prune:

-path pattern
... Para ignorar uma árvore de diretórios inteira, use -pruneem vez de verificar todos os arquivos da árvore. Por exemplo, para pular o diretório src/emacse todos os arquivos e diretórios contidos nele, e imprimir os nomes dos outros arquivos encontrados, faça algo assim:

find . -path ./src/emacs -prune -o -print

informação relacionada