GNU/Linux >> Linux Esercitazione >  >> Linux

Come Grep in modo ricorsivo attraverso archivi compressi?

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'esterno find 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 della reply 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.
Correlati:come verificare quali segnali sta ascoltando un processo?
Linux
  1. Come Grep nei file Pdf?

  2. Grep Come sopprimere la visualizzazione di file non corrispondenti?

  3. Come eseguire il grep con l'output a colori

  4. Come faccio a grep in modo ricorsivo?

  5. Come eseguire il "grep" di un flusso continuo?

Come trovare una stringa in un file su Linux

Come visualizzare il contenuto di un archivio o di un file compresso in Linux

Come usare grep in Linux

Come decomprimere gli archivi tar bz2 xz gz in Linux

Come Chown ricorsivamente su Linux

Come tracciare la corrente in ngspice?