Quiero enumerar todos los archivos en un directorio que comienzan con 'abc' y terminan con '.zip'
Estoy tratando de utilizar ls
.
El directorio tiene muchos archivos zip que comienzan con abc<date>
y xvz<date>
. Solo quiero obtener la lista deabc<date>.zip
ls -1 | grep "abc$(your_date).zip"
?Respuestas:
ls
no hace coincidencia de patrones en los nombres de archivo. Simplemente enumera el contenido de los directorios y los archivos que se le están dando como argumentos.Su shell, por otro lado, tiene una característica llamada globalización o generación de nombre de archivo que expande un patrón en una lista de archivos que coinciden con ese patrón.
Aquí ese patrón global sería
abc*.zip
(*
siendo un comodín que representa cualquier número de caracteres ).Lo pasaría a cualquier comando que desee, como
printf
para imprimir:También puede pasarlo
ls -l
para mostrar los atributos de esos archivos:(lo necesitamos
-d
porque si alguno de esos archivos es de tipo directorio ,ls
enumeraría su contenido de lo contrario).O para
unzip
extraerlos si solounzip
pudiera extraer más de un archivo a la vez. Desafortunadamente no lo hace, por lo que necesitaría usarxargs -n1
o unfor
bucle:O:
Pero, de hecho, al
unzip
ser más como un puerto de un comando de MS-DOS, enunzip
sí mismo trataría su argumento como un problema. En otras palabras,unzip 'abc*.zip'
no descomprimirá el archivo llamadoabc*.zip
(un nombre de archivo perfectamente válido en Unix, no en los sistemas operativos de Microsoft), sino los archivos que coinciden con elabc*.zip
patrón, por lo que realmente querrá:(En realidad nuestra
xargs
yfor
enfoque anterior sería un error, porque si hay un archivo llamadoabc*.zip
, por ejemplo,unzip
sería tratarlo como un patrón! Verbsdtar
una manera más unixy para extraerzip
los archivos)Para una coincidencia que no
[aA][bB][cC]*.[zZ][iI][pP]
distinga entre mayúsculas y minúsculas, usaría de forma portátil. Algunos proyectiles tienen operadores de globo extendido para la coincidencia entre mayúsculas y minúsculas:zsh
:O:
si solo desea que la
abc
parte no distinga entre mayúsculas y minúsculas.ksh93
:o:
con
bash
.(no hay forma de tener solo partes de los globos sensibles a mayúsculas y minúsculas que no sea mediante el uso de la sintaxis portátil).
con
yash
:mismo comentario que el
bash
anterior.fuente
Sin embargo, esto fallará si hay demasiados archivos (hay un límite para la expansión de shell en términos de cuántos argumentos puede expandirse).
Este es probablemente el más universal. Las citas deben estar ahí. Con algunas
find
implementaciones, también puede usar en-iname
lugar de-name
una búsqueda sin distinción entre mayúsculas y minúsculas (aBc<date>.ZIP
también coincidiría).Tenga en cuenta que
.*
y\.
dado que el filtro grep usa es regex, que es diferente de la notación comodín que el shell usa para la expansión. Usogrep -i
para búsqueda sin distinción entre mayúsculas y minúsculasfuente
execve()
llamada al sistema.find
también buscará esos archivos en subdirectorios. Usefind . ! -name . -prune -name 'abc*.zip' -print
ofind . -maxdepth 1 -name 'abc*.zip'
si susfind
soportes son-maxdepth
similares a GNU o BSD ofind . -depth 1 -name 'abc*.zip'
si esfind
compatible-depth <n>
con algunos BSD para restringirlos al directorio actual.$ ls ../*.a
funcionó para mí (lista de archivos en directorio principal).Intente
ls abc*.zip
reducir los resultados a aquellos que coincidan con sus criterios para una cadena inicial de abc y un final de .zip. El asterisco se expandirá para que coincida con esos resultados sin incluir los caracteres iniciales xvz.fuente
Debe especificar el directorio donde
ls
buscará en un ejemplofunciona para mí, pero obviamente no admite la búsqueda por patrón
fuente
abc
y terminar con.zip
.