¿Cómo puedo enumerar archivos con un nombre de archivo que termina con el último carácter y con .txt
extensión?
Lo he intentado ls *+([[:digit:]]).txt
pero esto es cierto para abc12.txt
y abc2.txt
.
Pero solo necesito llegar abc2.txt
. ¿Cómo puedo hacer eso?
¿Hay alguna forma de :digit:
hacer eso?
shopt -s extglob
.Respuestas:
Qué tal si:
El
!
principio del grupo complementa su significado.Como se señaló en los comentarios, esto es bash, intente, por ejemplo:
fuente
ls
) no admite expresiones regulares aquí. Estas son expresiones de nombre de archivo (Globbing) . Puede ver la diferencia ya en su ejemplo: aquí,*
hay un comodín, que no está allí en las expresiones regulares, donde usaría.*
para lograr lo mismo. Las expresiones regulares son mucho más poderosas que el globbing.La pregunta pedía expresiones regulares. Bash, y por lo tanto
ls
, no admite expresiones regulares aquí. Lo que admite son expresiones de nombre de archivo ( Globbing ), una forma de comodines. Las expresiones regulares son mucho más poderosas que eso.Si realmente quieres usar expresiones regulares, puedes usar
find -regex
así:Buscar es recursivo por defecto, pero
ls
no lo es. Para buscar solo archivos en el directorio actual, puede deshabilitar la recursividad con-maxdepth 1
. Encuentra coincidencias con el nombre del archivo con la ruta, por eso los nombres de los archivos comienzan./
si ejecutas find in.
. La expresión regular comienza con\./
hacer frente a eso. Tenga en cuenta que en una expresión regular,.
es un carácter especial que coincide con cualquier carácter, pero aquí realmente queremos un punto, por eso nos escapamos con una barra invertida. Hacemos lo mismo para el punto.txt
, porque la expresión regular también coincidiríaAtxt
. Las clases de dígitos son las mismas que para globbing, solo que necesita en^
lugar de!
invertir la clase de caracteres.Si desea obtener la salida de
ls
, entonces puede usar-exec ls
así:find
admite un par de diferentes sabores de expresiones regulares. Puede especificar un-regextype
, por ejemplo:Para mí, los tipos posibles son: 'findutils-default', 'awk', 'egrep', 'ed', 'emacs', 'gnu-awk', 'grep', 'posix-awk', 'posix-basic' , 'posix-egrep', 'posix-extended', 'posix-minimal-basic', 'sed' Puede ejecutar
find -regextype help
para averiguar qué es compatible con su sistema.fuente
Con el ksh extendió pegotes (o
bash -O extglob
ozsh -o kshglob
) que ya está usando, que sería:O
Si quieres hacer coincidir
a1.txt
y2.txt
no peroa12.txt
tampoco12.txt
.Sin embargo, tenga en cuenta que en ksh y bash (a menos que configure la
failglob
opción de obtener un comportamiento similar al de zsh), si ese patrón no coincide con ningún archivo, el patrón se pasará literalmente als
, y si ese archivo (con un nombre extraño) sucede existe, aparecerá en la listals
aunque no coincida con el patrón en sí.Para incluir
.2.txt
, establezca ladotglob
opción debash
, añadir el(D)
calificativo pegote enzsh
, o conjuntoFIGNORE
de!(.|..)
enksh93
.fuente