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.zip
bir 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$PWD
Geç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 find
yerine {}
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
. reply
Diziyi ayarlamak, eşleşmeyi bir ad listesine dönüştürür.
$REPLY\#
arşivin dizin görünümüdür.
$REPLY\#/**/*.pm
.pm
arşivdeki dosyalarla eşleşir .
N
Eşleşme varsa desen yapar eleme glob boş listeye genişler.