![Usando grep para filtrar pastas com números](https://rvso.com/image/1618326/Usando%20grep%20para%20filtrar%20pastas%20com%20n%C3%BAmeros.png)
Eu estava tentando listar apenas pastas com números filtrando umls -1
(a opção -1
élistar um arquivo por linha) através do grep (eu sei que o find também pode fazer isso, mas por causa deste exemplo, quero me limitar ao grep)
As pastas são
PC:test user$ ls -1
1184
36
69929
7
9907
Agora é isso que recebo com as diferentes saídas ...
Este: não entendo por que 9907 está lá, pois de alguma forma fazia sentido que apenas a pasta 7 de um dígito estivesse?
PC:test user$ ls -1 | grep [0-9]
7
9907
Está faltando 7. A .
média é 2 ou mais?
PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907
Isso significa combinar tudo com um número ali?
PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907
Quando entre aspas, funciona como eu esperava, então por quê? É equivalente a [0-9].*
?
PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
Responder1
"substituição de nome de arquivo" ou "expansão de nome de caminho" ou "globbing"
Quando você digita um comando, ele é submetido a vários estágios de transformação potencialantesqualquer programa (como grep) é invocado.
[
é um caractere especial em alguns shells.
$ echo [0-9]
7
O que acho que está acontecendo aqui é que o shell está expandindo 0-9 como uma seleção de nome de arquivo e encontrando seu arquivo "7" e, portanto, passando "7" para grep. Portanto, o grep está procurando nomes de arquivos que contenham um "7" em qualquer lugar do nome do arquivo.
Se você deseja [
ser processado pelo grep e não pelo shell, você deve citar a string ou enganar o shell para que analise a expressão de maneira diferente.
$ echo [0-9].
[0-9].
Citar é recomendado.
Veja também man bash
(procure for
) man test
e página 151 deesse
expressões regulares
Em uma expressão regular, .
significa “qualquer caractere único”. Então [0-9].
significa qualquer dígito seguido por um único caractere. O nome do arquivo 7
não possui o último.
Se você deseja que o grep encontre nomes de arquivos de um único dígito, você precisa ancorar sua expressão no início e no final da linha
$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
$ ls -1 | grep '^[0-9]$'
7
Ops, destruí meu computador
O uso descuidado de caracteres especiais leva a todos os tipos de resultados interessantes
$ ls -1 > x
$ grep *
x:1184
Isso deve ficar mais claro se você considerar
$ ls -1
1184
36
69929
7
9907
x
$ echo *
1184 36 69929 7 9907 x
Agora basta adicionar rm
e sudo
à mistura e você poderá ter uma experiência que pode mudar drasticamente sua carreira.