Snažím se zjistit, jaké moduly use Test::Version
v cpan. Takže jsem použil minicpan
zrcadlit to. Můj problém je, že musím procházet stažené archivy a grepovat soubory, které jsou v archivech. Může mi někdo říct, jak to mohu udělat? nejlépe způsobem, který mi řekne, který soubor v archivu a na jakém řádku je.
(poznámka:nejsou to všechny tarbally, ale jsou to soubory zip)
Přijatá odpověď:
Dobře, použijme filozofii unixu. Jaké jsou součásti tohoto úkolu?
- Textové vyhledávání:potřebujete nástroj pro vyhledávání textu v souboru, jako je
grep
. - Rekurzivní:potřebujete nástroj k hledání souborů ve stromu adresářů, jako je
find
. - Archiv:k jejich čtení potřebujete nástroj.
Většina unixových programů pracuje se soubory. Chcete-li tedy snadno pracovat s archivními komponentami, musíte k nim přistupovat jako k souborům, jinými slovy k nim musíte přistupovat jako k adresářům.
Souborový systém AVFS představuje pohled na souborový systém, kde každý archivní soubor /path/to/foo.zip
je přístupný jako adresář ~/.avfs/path/to/foo/zip#
. AVFS poskytuje přístup pouze pro čtení k většině běžných formátů archivních souborů.
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
Vysvětlení:
- Připojte souborový systém AVFS.
- Hledejte archivní soubory v
~/.avfs$PWD
, což je pohled AVFS na aktuální adresář. - Pro každý archiv spusťte zadaný fragment shellu (s
$0
=název archivu a$1
=vzor k vyhledávání). $0#
je zobrazení adresáře archivu$0
.{}
spíše než{}
je potřeba v případě, že vnějšífind
nahradí{}
uvnitř-exec ;
argumenty (někteří to dělají, někteří ne).- Volitelné:nakonec odpojte souborový systém AVFS.
Nebo v zsh ≥4.3:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e''
reply=($REPLY#/**/*.pm(.N))
'')
Vysvětlení:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip)
odpovídá archivům v zobrazení AVFS aktuálního adresáře a jeho podadresářů.PATTERN(e''CODE'')
aplikuje KÓD na každou shodu VZORU. Název odpovídajícího souboru je v$REPLY
. Nastaveníreply
pole změní shodu na seznam jmen.$REPLY#
je zobrazení adresáře archivu.$REPLY#/**/*.pm
odpovídá.pm
soubory v archivu.- Číslo
N
kvalifikátor glob způsobí, že se vzor rozbalí na prázdný seznam, pokud neexistuje žádná shoda.