Tamam, unix felsefesini uygulayalım. Bu görevin bileşenleri nelerdir?
- Metin arama: Bir dosyadaki metni aramak için bir araca ihtiyacınız vardır
grep.
- Özyinelemeli: gibi bir dizin ağacındaki dosyaları aramak için bir araca ihtiyacınız vardır
find.
- Arşivler: okumak için bir araca ihtiyacınız var.
Çoğu unix programı dosyalar üzerinde çalışır. Bu nedenle arşiv bileşenlerinde kolayca çalışmak için, onlara dosya olarak erişmeniz gerekir, başka bir deyişle onlara dizin olarak erişmeniz gerekir.
AVF'lerin dosya sistemi hediyeler her arşiv dosyası dosya sisteminin bir görünüm /path/to/foo.zipbir dizin olarak erişilebilir ~/.avfs/path/to/foo/zip#. AVFS, en yaygın arşiv dosyası biçimlerine salt okunur erişim sağlar.
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
açıklamalar:
- AVFS dosya sistemini bağlayın.
~/.avfs$PWDGeçerli dizinin AVFS görünümü olan arşiv dosyalarını arayın .
- Her arşiv için, belirtilen kabuk snippet'ini yürütün (
$0= arşiv adı ve $1= aranacak kalıpla).
$0#arşivin dizin görünümüdür $0.
{\}ziyade {}dış durumda ihtiyaç duyulan findyerine {}içindeki -exec ;argümanlar (bazı bunu, bazı yoktur).
- İsteğe bağlı: son olarak AVFS dosya sistemini çıkarın.
Veya zsh ≥4.3 olarak:
mountavfs
grep 'Test::Version' ~/.avfs$PWD/**/*.(tgz|tar.gz|zip)(e\''
reply=($REPLY\#/**/*.pm(.N))
'\')
açıklamalar:
~/.avfs$PWD/**/*.(tgz|tar.gz|zip) geçerli dizinin ve alt dizinlerinin AVFS görünümündeki arşivlerle eşleşir.
PATTERN(e\''CODE'\')her PATTERN eşleşmesine CODE uygular. Eşleşen dosyanın adı $REPLY. replyDiziyi ayarlamak, eşleşmeyi bir ad listesine dönüştürür.
$REPLY\# arşivin dizin görünümüdür.
$REPLY\#/**/*.pm.pmarşivdeki dosyalarla eşleşir .
NEşleşme varsa desen yapar eleme glob boş listeye genişler.