Ok, apliquemos la filosofía de Unix. ¿Cuáles son los componentes de esta tarea?
- Búsqueda de texto: necesita una herramienta para buscar texto en un archivo, como
grep.
- Recursivo: necesita una herramienta para buscar archivos en un árbol de directorios, como
find.
- Archivos: necesitas una herramienta para leerlos.
La mayoría de los programas de Unix funcionan con archivos. Por lo tanto, para operar fácilmente en componentes de archivo, debe acceder a ellos como archivos, en otras palabras, debe acceder a ellos como directorios.
El sistema de archivos AVFS presenta una vista del sistema de archivos donde /path/to/foo.zipse puede acceder a cada archivo como un directorio ~/.avfs/path/to/foo/zip#. AVFS proporciona acceso de solo lectura a los formatos de archivo de almacenamiento más comunes.
mountavfs
find ~/.avfs"$PWD" \( -name '*.zip' -o -name '*.tar.gz' -o -name '*.tgz' \) \
-exec sh -c '
find "$0#" -name "*.pm" -exec grep "$1" {\} +
' {} 'Test::Version' \;
fusermount -u ~/.avfs # optional
Explicaciones:
- Montar el sistema de archivos AVFS.
- Busque archivos en
~/.avfs$PWD, que es la vista AVFS del directorio actual.
- Para cada archivo, ejecute el fragmento de shell especificado (con
$0= nombre de archivo y $1= patrón para buscar).
$0#es la vista de directorio del archivo $0.
{\}en lugar de {}ser necesario en caso de que los findsustitutos externos sean argumentos {}internos -exec ;(algunos lo hacen, otros no).
- Opcional: finalmente desmonte el sistema de archivos AVFS.
O en zsh ≥4.3:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*.pm(.N))
'\')
Explicaciones:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip) coincide con los archivos en la vista AVFS del directorio actual y sus subdirectorios.
PATTERN(e\''CODE'\')aplica el CÓDIGO a cada coincidencia de PATRÓN. El nombre del archivo coincidente está en $REPLY. Establecer la replymatriz convierte la coincidencia en una lista de nombres.
$REPLY\# es la vista de directorio del archivo.
$REPLY\#/**/*.pmcoincide con .pmarchivos en el archivo.
- El
Ncalificador global hace que el patrón se expanda a una lista vacía si no hay coincidencia.