Tengo una lista de ".c" (archivos c) en el directorio actual.
Tengo que encontrar todos los archivos .c en el directorio actual.
El comando que se puede utilizar id ls * .c
Pero, otra forma es usar grep.
entonces si doy
ls | grep *.c
No devuelve ningún resultado para este comando, mientras que para otros tipos de archivos como ".java", ".txt" da los resultados esperados.
¿Hay algún significado especial para "* .c" en el comando grep? ¿O puedo saber la razón de este comportamiento?
ls *.c
?Respuestas:
*.c
es un patrón glob, mientras quegrep
busca expresiones regulares.Usted quiere
ls | grep '\.c$'
Si quieres encontrar todos los archivos que terminan en.c
.grep
coincide con cualquier subcadena de forma predeterminada, no con toda la cadena, por lo que no necesita escribir algo que coincida con el principio del nombre de archivo. Si quisieras escribir eso, sería.*
en una expresión regular..
indica "cualquier carácter excepto una línea que termina", y*
indica "cualquier número (cero o más) de la expresión anterior".Porque
.
tiene un significado especial en una expresión regular, si desea hacer coincidir un literal.
, necesitas escapar con\
. Porque\
tiene un significado especial en el shell, necesita citar la expresión regular con comillas simples ('
).Para asegurarse de que coincida solo al final del nombre de archivo, use
$
, que coincide con el final de la línea.fuente
O use buscar, luego obtenga una lista si es necesario, por ejemplo.
Encontrar es muy útil.
fuente
find . -maxdepth 1 -name "*.c" -exec ls -al {} \;
grep está buscando el contenido de los archivos para su REGEX, no los nombres de los archivos.
fuente
ls | grep *.c
se está realizando si hay más de un archivo en el directorio actual, debido a la expansión de bash, como expliqué en mi respuesta.Por favor, inténtalo:
El RegExp "*" no es necesario
fuente
grep "* .c" buscará LITERALMENTE la cadena "* .c", es decir, la cadena "asterisco punto c" sin expandirla para que signifique "todos los archivos con extensión .c", por lo que no está encontrando Cualquier cosa en la salida de "ls":
# touch b.c
# ls -1 | grep "* .c"
el resultado está vacío.
Si desea expansión, debe usar egrep (grep extendido) que hace expresiones regulares. Pero aquí son un poco diferentes:
es decir, la expresión regular es:. *. c (cualquier carácter que no sea de nueva línea se multiplica por cero o más veces, cualquier carácter que no sea de nueva línea [se podría escapar para que signifique literalmente "punto"], "c")
fuente
Es necesario citar asteriscos:
o el shell bash lo va a expandir y ejecutar algo como:
(Suponiendo que tenga archivos nombrados
1.c
,2.c
,3.c
en el directorio actual).Lo cual no va a dar el resultado que estás esperando.
Lo que realmente hará es buscar el contenido de
2.c
y3.c
y mostrar las líneas que tiene la cadena1.c
en él, que probablemente no sean ninguno, y es por eso que obtienes un resultado vacío.(Solo estoy explicando por qué obtuviste una salida vacía, como dijo otro,
*.c
no es un regex válido tampoco)fuente