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.zip
se 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 find
sustitutos 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 reply
matriz convierte la coincidencia en una lista de nombres.
$REPLY\#
es la vista de directorio del archivo.
$REPLY\#/**/*.pm
coincide con .pm
archivos en el archivo.
- El
N
calificador global hace que el patrón se expanda a una lista vacía si no hay coincidencia.