Eu tenho um conjunto bastante complexo de arquivos a serem encontrados e reagidos (por exemplo, caminhos copiados para um arquivo de texto):
Por exemplo:
find / \( -iname "*ssh*" -or -iname "*scp*" \) \( -not -path -"/run" -not -path "/rw/*" -and -not -path "/home/*" -and -not -path "*/qml/*" \) >> ~/files.txt
Aqui, desejo encontrar todos os arquivos ou pastas relacionados a "ssh" e "scp", mas não nos diretórios /run ou /rw.
Estarei adicionando mais condições a isso, mas os comandos ficam muito longos. Como posso fazer isso com regex?
O melhor seria não descer nos diretórios que você deseja excluir, em vez de filtrar os arquivos depois do fato com
! -path <pattern>
:Aqui usando
find
a sintaxe POSIX. Com GNUfind
, isso poderia ser:Com BSD
find
, você apenas usa-E
like ingrep
oused
para obter POSIX EREs:Aqui está uma versão com quebras de linha que é um pouco mais fácil de ler e com algumas correções de erros de digitação. Estou assumindo que o GNU encontra, mas pequenas modificações funcionarão com a maioria dos achados do BSD também.
Agora, para simplificar um pouco,
-iname "*ssh*" -or -iname "*scp*"
pode ser escrito como um regex comoe agora você pode adicionar nomes extras com mais facilidade, como
(ssh|scp|rsync|...)
.Os
-not -path
testes podem ser combinados em um regex como este:mas
find
ainda perderá muito tempo explorando esses diretórios, a menos que você use-prune
: