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


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.


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


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.


-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


1
Esto no aborda la pregunta; los archivos deberían comenzar abcy terminar con .zip.
— Jeff Schaller
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.