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 find
apenas 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 /mnt
e 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 find
de ignorar minhas opções de exclusão de diretório?
Responder1
Find's -path
nã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
:
-mount
Nã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 -path
predicado é avaliado para cada arquivo encontrado e, para os arquivos dessa árvore, ele simplesmente falha. Isso não afeta o modo como find
a á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 *.txt
dentro 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-prune
em vez de verificar todos os arquivos da árvore. Por exemplo, para pular o diretóriosrc/emacs
e 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