Encuentre recursivamente todos los archivos de diversos formatos y búsquelos en busca de patrones de nombres de archivos.

Encuentre recursivamente todos los archivos de diversos formatos y búsquelos en busca de patrones de nombres de archivos.

En el mejor de los casos me gustaría recibir una llamada como esta:

$searchtool /path/to/search/ -contained-file-name "*vacation*jpg"

... para que esta herramienta

  • hace un escaneo recursivo de la ruta dada
  • toma todos los archivos con formatos de archivo compatibles que deberían ser al menos los "más comunes" como zip, rar, 7z, tar.bz, tar.gz...
  • y escanee la lista de archivos del archivo para encontrar el patrón de nombre en cuestión (aquí *vacation*jpg)

Sé cómo utilizar la herramienta de búsqueda, tar, descomprimir y similares. Podría combinarlos con un script de shell, pero estoy buscando una solución simple que podría ser una línea de shell o una herramienta dedicada (las sugerencias para las herramientas GUI son bienvenidas, pero mi solución debe estar basada en la línea de comandos).

Respuesta1

Si quieres algo más simple que la solución AVFS, escribí un script en Python para hacerlo llamadoencontrar el arca. En realidad puedes simplemente hacer

$ arkfind /path/to/search/ -g "*vacation*jpg"

Hará esto de forma recursiva, para que puedas mirar archivos dentro de archivos con una profundidad arbitraria.

Respuesta2

(Adaptado de¿Cómo puedo buscar de forma recursiva en archivos comprimidos?)

InstalarAVFS, un sistema de archivos que proporciona acceso transparente al interior de los archivos. Primero ejecute este comando una vez para configurar una vista del sistema de archivos de su máquina en la que pueda acceder a los archivos como si fueran directorios:

mountavfs

Después de esto, si /path/to/archive.zipes un archivo reconocido, entonces ~/.avfs/path/to/archive.zip#hay un directorio que parece contener el contenido del archivo.

find ~/.avfs"$PWD" \( -name '*.7z' -o -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
     -exec sh -c '
                  find "$0#" -name "*vacation*.jpg"
                 ' {} 'Test::Version' \;

Explicaciones:

  • Monte el sistema de archivos AVFS.
  • Busque archivos comprimidos en ~/.avfs$PWD, que es la vista AVFS del directorio actual.
  • Para cada archivo, ejecute el fragmento de shell especificado (con $0= nombre del archivo y $1= patrón para buscar).
  • $0#es la vista de directorio del archivo $0.
  • {\}en lugar de {}es necesario en caso de que el exterior findsustituya los argumentos {}internos -exec ;(algunos lo hacen, otros no).

O en zsh ≥4.3:

mountavfs
ls -l ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)(e\''
     reply=($REPLY\#/**/*vacation*.jpg(.N))
'\')

Explicaciones:

  • ~/.avfs$PWD/**/*.(7z|tgz|tar.gz|zip)coincide con archivos en la vista AVFS del directorio actual y sus subdirectorios.
  • PATTERN(e\''CODE'\')aplica CÓDIGO a cada coincidencia de PATRÓN. El nombre del archivo coincidente está en formato $REPLY. Configurar la replymatriz convierte la coincidencia en una lista de nombres.
  • $REPLY\#es la vista de directorio del archivo.
  • $REPLY\#/**/*vacation*.jpgcoincide con *vacation*.jpglos archivos del archivo.
  • El Ncalificador global hace que el patrón se expanda a una lista vacía si no hay ninguna coincidencia.

Respuesta3

Otra solución que funciona eszgrep

zgrep -r filename *.zip

Respuesta4

Mihabitualsolución:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|DESIRED_FILE_TO_SEARCH'

Ejemplo:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|characterize.txt'

Los resultados son como:

foozip1.zip:
foozip2.zip:
foozip3.zip:
    DESIRED_FILE_TO_SEARCH
foozip4.zip:
...

Si desea sólo el archivo zip congolpesen eso:

find -iname '*.zip' -exec unzip -l {} \; 2>/dev/null | grep '\.zip\|FILENAME' | grep -B1 'FILENAME'

NOMBRE DEL ARCHIVOAquí se usa dos veces, por lo que puedes usar una variable.

Con encontrar podrías usarRUTA/HACIA/BÚSQUEDA

información relacionada