Procura por arquivos dentro de um diretório

3

Estou tentando pesquisar todos os arquivos que receberam determinado valor de string / regex. Então, se eu dissesse pesquisar por todos os arquivos que têm "olá" no nome, como eu faria isso? Cada vez mais complexo, como eu encontraria um arquivo cujo nome começa com duas letras seguidas por um traço e depois um número?

Eu tentei o comando find e isso ajudou na situação do hello. Gostaria de digitar find <dir> *hello* , mas isso não funciona com os valores de regex.

Se eu digitar find -E <dir> -regex '^[a-z]{2}-[1-9]' , nada acontece. Mesmo se eu digitar find -E <dir> -regex '*[0-9]*' , nada acontece.

Alguém poderia me ajudar com isso? Agradecemos antecipadamente

    
por ReallyGoodPie 17.08.2016 / 10:35

2 respostas

3

-regex corresponde ao caminho do arquivo inteiro (não apenas ao nome) e é ancorado por padrão ( ^ e $ implícito).

Aqui, você não precisa de regexps, você pode usar o padrão -name , que usa um padrão curinga e corresponde ao nome do arquivo, não ao caminho:

find . -name '*hello*' -name '[[:alpha:]][[:alpha:]]-[1-9]*'

Para nomes de arquivos que começam com 2 letras, um hífen e um dígito de 1 a 9 e contêm "olá".

Com regexps, e aqui com FreeBSD / OS / X find , isso teria que ser:

find -E . -regex '.*hello[^/]*' -regex '.*/[[:alpha:]]{2}-[1-9][^/]*'

Você precisa de [^/]* em vez de .* , caso contrário, isso corresponderia a ./aa-9/hello/foo/bar , por exemplo.

Em qualquer caso, find <dir> *hello* não faz o que você acha que faz. O shell expande esse *hello* glob para a lista de arquivos ou diretórios não ocultos no diretório atual cujo nome contém "hello" e passa o resultado como argumentos extras para find .

    
por 17.08.2016 / 15:09
2

Isso falha porque *[0-9]* é um glob e não um regex . Em globs, * significa "0 ou mais caracteres". No entanto, em expressões regulares, * significa "0 ou mais do que quer que esteja antes do *". Em outras palavras, * é um quantificador e só é relevante se estiver quantificando algo.

Assim, a expressão regular que corresponde a 0 ou mais caracteres e, em seguida, 0 ou mais números é .*[0-9]* . Além disso, ao usar -regex com find , a expressão regular é correspondida ao pat inteiro do arquivo, portanto, é necessário levar isso em consideração. Juntando tudo isso, o que você está procurando é:

find /path/to/dir -regex '.*/[a-z][a-z]-[1-9]‌​.*'

Finalmente, você deve sempre citar tais construções ao passá-las para encontrar. Se você não fizer isso, o shell os expandirá (assim, * se tornará a lista de todos os arquivos e diretórios em seu diretório atual) antes de passá-los para find .

    
por 17.08.2016 / 14:58