Sto cercando di scoprire quali moduli use Test::Version
in cpan. Quindi ho usato minicpan
per rispecchiarlo. Il mio problema è che devo scorrere gli archivi che vengono scaricati e grep i file che si trovano negli archivi. Qualcuno può dirmi come potrei farlo? preferibilmente in un modo che mi dica quale file nell'archivio e in quale riga si trova.
(nota:non sono tutti tarball alcuni sono file zip)
Risposta accettata:
Ok, applichiamo la filosofia unix. Quali sono i componenti di questa attività?
- Ricerca di testo:hai bisogno di uno strumento per cercare il testo in un file, come
grep
. - Ricorsivo:hai bisogno di uno strumento per cercare i file in un albero di directory, come
find
. - Archivi:serve uno strumento per leggerli.
La maggior parte dei programmi Unix opera su file. Quindi per operare facilmente sui componenti dell'archivio, devi accedervi come file, in altre parole devi accedervi come directory.
Il filesystem AVFS presenta una vista del filesystem in cui ogni file di archivio /path/to/foo.zip
è accessibile come directory ~/.avfs/path/to/foo/zip#
. AVFS fornisce accesso in sola lettura ai formati di file di archivio più comuni.
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
Spiegazioni:
- Monta il filesystem AVFS.
- Cerca i file di archivio in
~/.avfs$PWD
, che è la vista AVFS della directory corrente. - Per ogni archivio, esegui il frammento di shell specificato (con
$0
=nome archivio e$1
=modello da cercare). $0#
è la vista directory dell'archivio$0
.{}
anziché{}
è necessario nel caso in cui l'esternofind
sostituisce{}
dentro-exec ;
argomenti (alcuni lo fanno, altri no).- Facoltativo:finalmente smonta il filesystem AVFS.
Oppure in zsh ≥4.3:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e''
reply=($REPLY#/**/*.pm(.N))
'')
Spiegazioni:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip)
trova gli archivi nella vista AVFS della directory corrente e delle sue sottodirectory.PATTERN(e''CODE'')
applica il CODICE ad ogni corrispondenza di PATTERN. Il nome del file corrispondente è in$REPLY
. Impostazione dellareply
array trasforma la corrispondenza in un elenco di nomi.$REPLY#
è la vista directory dell'archivio.$REPLY#/**/*.pm
corrisponde a.pm
file nell'archivio.- Il
N
il qualificatore glob fa espandere il pattern in un elenco vuoto se non c'è corrispondenza.