![Usando grep para filtrar carpetas con números](https://rvso.com/image/1618326/Usando%20grep%20para%20filtrar%20carpetas%20con%20n%C3%BAmeros.png)
Estaba intentando enumerar solo carpetas con números que filtran unls -1
(la opción -1
esenumerar un archivo por línea) a través de grep (sé que find también puede hacerlo, pero por el bien de este ejemplo quiero seguir con grep)
Las carpetas son
PC:test user$ ls -1
1184
36
69929
7
9907
Ahora esto es lo que obtengo con las diferentes salidas...
Este: No entiendo por qué 9907 está allí, ya que de alguna manera tenía sentido que solo estuviera la carpeta 7 de un solo dígito.
PC:test user$ ls -1 | grep [0-9]
7
9907
A esto le falta 7. ¿Significa .
2 o más?
PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907
¿Esto significa hacer coincidir todo lo que tenga un número allí?
PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907
Entre comillas, simplemente funciona como era de esperar, entonces, ¿por qué? ¿Es el equivalente a [0-9].*
?
PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
Respuesta1
"sustitución de nombre de archivo" o "expansión de nombre de ruta" o "globbing"
Cuando escribes un comando, está sujeto a varias etapas de transformación potencial.antesse invoca cualquier programa (como grep).
[
es un carácter especial en algunos shells.
$ echo [0-9]
7
Lo que creo que está sucediendo aquí es que el Shell está expandiendo 0-9 como una selección de nombre de archivo y encuentra su archivo "7" y, por lo tanto, pasa "7" a grep. Por lo tanto, grep busca nombres de archivos que contengan un "7" en cualquier parte del nombre del archivo.
Si desea [
que grep lo procese y no el shell, debe citar la cadena o engañar al shell para que analice la expresión de manera diferente.
$ echo [0-9].
[0-9].
Se recomienda citar.
Véase también man bash
(busque for
) man test
y la página 151 deeste
expresiones regulares
En una expresión regular, .
significa "cualquier carácter". Significa [0-9].
cualquier dígito seguido de un solo carácter. El nombre del archivo 7
carece de este último.
Si desea que grep encuentre nombres de archivos de un solo dígito, debe anclar su expresión tanto al inicio como al final de la línea.
$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907
$ ls -1 | grep '^[0-9]$'
7
Ups, destruí mi computadora.
El uso descuidado de caracteres especiales conduce a todo tipo de resultados interesantes.
$ ls -1 > x
$ grep *
x:1184
Esto debería quedar más claro si consideramos
$ ls -1
1184
36
69929
7
9907
x
$ echo *
1184 36 69929 7 9907 x
Ahora simplemente agregue rm
y sudo
a la mezcla y podrá tener una experiencia que podría cambiar drásticamente su carrera.