GNU/Linux >> Znalost Linux >  >> Linux

Jak rekurzivně grepovat prostřednictvím komprimovaných archivů?

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.
Související:Jak zkontrolovat, jaké signály proces poslouchá?
Linux
  1. Jak používat Linuxový příkaz grep

  2. Grep Jak potlačit zobrazení neshodného souboru?

  3. Jak najít více řetězců v souborech?

  1. Jak archivovat a komprimovat soubory na Linuxu

  2. Příklady cpio pro Linux:Jak vytvořit a extrahovat archivy cpio (a archivy tar)

  3. Jak grep \nv souboru

  1. Jak Grep v souborech Pdf?

  2. Jak se popasovat s barevným výstupem

  3. Jak mohu grep rekurzivně?