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.zip
es 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 exteriorfind
sustituya 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 lareply
matriz convierte la coincidencia en una lista de nombres.$REPLY\#
es la vista de directorio del archivo.$REPLY\#/**/*vacation*.jpg
coincide con*vacation*.jpg
los archivos del archivo.- El
N
calificador 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