Eu gostaria de usar find
para corresponder a um caminho, mas encontrei isso:
-path pattern
O nome do arquivo corresponde ao padrão do shell. Os metacaracteres não tratam
/' or
.' especialmente; assim, por exemplo,find . -path "./sr*sc"
imprimirá uma entrada para um diretório chamado
./src/misc
(se existir).
Como posso fazer com que corresponda apenas aos arquivos no diretório atual? Preciso de outra ferramenta para este trabalho?
Editar. Como sugerido aqui estão alguns detalhes. Para fazer este trabalho existem -maxdepth
e -regex
para uso. No entanto, em aplicações reais, o caminho pode ser uma variável em vez de uma simples constante aqui, onde -maxdepth
não funcionará bem e -regex
pode parecer um exagero. Então, eu gostaria de saber se existe uma solução simples find
para fazê-lo respeitar a barra. Abaixo está o rsync doc descrevendo seu comportamento que é muito próximo do que eu quero.
Atualmente a melhor solução é usar regex, mas se você souber de algo que possa torná-lo mais simples, seria bem-vindo.
Como exemplo do que eu quero, aqui está a regra do padrão rsync:
um '*' corresponde a qualquer componente de caminho, mas para nas barras.
use '**' para corresponder a qualquer coisa, incluindo barras.
Use
-regex
em vez disso. O padrão é ancorado no início e no final, então você precisará usar.*
no início e no final provavelmente. Use[^/]*/
para substituir um glob*
que não corresponde/
. Por exemplo:Existe um pequeno script Perl find2perl que afirma converter os argumentos em um
find
comando em um script Perl equivalente. Obviamente, ele terá o mesmo padrão de correspondência para-path
asfind
, mas você pode editá-lo para aceitar outro argumento, digamos-glob
, que usaria a chamada do sistemafnmatch()
para fazer o tipo de globbing desejado. Eu fiz uma modificação rápida na minha versãofind2perl
como mostrado neste patch:(As linhas que começam
+
mostram as 3 linhas que adicionei). Eu precisava adicionar pacotesperl-App-find2perl
eperl-File-FnMatch
para o Fedora. Você precisaria encontrar o equivalente em seu sistema.Você pode então executar comandos como
Para evitar
find
a recursão em subdiretórios, use-maxdepth
sinalizadorAlguns shells, como
zsh
,bash
eksh93
suportam o**
padrão de globbing de nome de arquivo. Nelezsh
está habilitado por padrão enquantobash
tem que habilitá-lo comshopt -s globstar
eksh93
comset -o globstar
.Isso significa que você deve ser capaz de fazer, por exemplo,
Alguns
find
testes semelhantes, como-type f
, podem ser facilmente incorporados a isso: