listado de archivos con patrón con inicio y fin

9

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

unix_dude
fuente
ls -1 | grep "abc$(your_date).zip" ?
Stan Strum

Respuestas:

15

lsno 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 printfpara imprimir:

printf '%s\n' abc*.zip

También puede pasarlo ls -lpara mostrar los atributos de esos archivos:

ls -ld abc*.zip

(lo necesitamos -dporque si alguno de esos archivos es de tipo directorio , lsenumeraría su contenido de lo contrario).

O para unzipextraerlos si solo unzippudiera extraer más de un archivo a la vez. Desafortunadamente no lo hace, por lo que necesitaría usar xargs -n1o un forbucle:

printf '%s\0' abc*.zip | xargs -r0n1 unzip

O:

for file in abc*.zip; do unzip "$file"; done

Pero, de hecho, al unzipser más como un puerto de un comando de MS-DOS, en unzipsí mismo trataría su argumento como un problema. En otras palabras, unzip 'abc*.zip'no descomprimirá el archivo llamado abc*.zip(un nombre de archivo perfectamente válido en Unix, no en los sistemas operativos de Microsoft), sino los archivos que coinciden con el abc*.zippatrón, por lo que realmente querrá:

 unzip 'abc*.zip'

(En realidad nuestra xargsy forenfoque anterior sería un error, porque si hay un archivo llamado abc*.zip, por ejemplo, unzipsería tratarlo como un patrón! Ver bsdtaruna manera más unixy para extraer ziplos 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:

    setopt extendedglob
    ls -ld (#i)abc*.zip
    

    O:

    ls -ld ((#i)abc)*.zip
    

    si solo desea que la abcparte no distinga entre mayúsculas y minúsculas.

  • ksh93:

    ls -ld ~(i)abc*.zip
    

    o:

    ls -ld ~(i:abc)*.zip
    
  • con bash.

    shopt -s nocaseglob
    ls -ld abc*.zip
    

    (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:

    set +o case-glob
    ls -ld abc*.zip
    

    mismo comentario que el bashanterior.

Stéphane Chazelas
fuente
9
ls abc*.zip

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).

find . -name "abc*.zip"

Este es probablemente el más universal. Las citas deben estar ahí. Con algunas findimplementaciones, también puede usar en -inamelugar de -nameuna búsqueda sin distinción entre mayúsculas y minúsculas ( aBc<date>.ZIPtambién coincidiría).

ls | grep -x "abc.*\.zip"

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. Uso grep -ipara búsqueda sin distinción entre mayúsculas y minúsculas

Jan Dusek
fuente
1
Tenga en cuenta que ese límite no es un límite de shell. Es un límite de kernel en la execve()llamada al sistema.
Stéphane Chazelas
Probablemente debería notarse que findtambién buscará esos archivos en subdirectorios. Use find . ! -name . -prune -name 'abc*.zip' -printo find . -maxdepth 1 -name 'abc*.zip'si sus findsoportes son -maxdepthsimilares a GNU o BSD o find . -depth 1 -name 'abc*.zip'si es findcompatible -depth <n>con algunos BSD para restringirlos al directorio actual.
Stéphane Chazelas
$ ls ../*.afuncionó para mí (lista de archivos en directorio principal).
Daniel
0

Intente ls abc*.zipreducir 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.

Jeff
fuente
-1

Debe especificar el directorio donde lsbuscará en un ejemplo

ls -la ~/file*.* 
ls -la ./file*.*

funciona para mí, pero obviamente no admite la búsqueda por patrón

Kevin Montalvo
fuente
1
Esto no aborda la pregunta; los archivos deberían comenzar abcy terminar con .zip.
Jeff Schaller