Globstar kullanabilirsiniz.
İle globstar
kabuk seçeneği etkin, tüm ihtiyaç vardır gzip -vk **/*.{css,html}
.
Bash kabuğu, globstar
tekrarlayan globları yazmanıza izin veren bir seçeneğe sahiptir **
. shopt -s globstar
sağlar. Ancak daha sonra çalıştırdığınız diğer komutlar için bunu yapmak istemeyebilirsiniz, böylece onu ve gzip
komutunuzu bir alt kabukta çalıştırabilirsiniz .
Bu komut gzip
hepsi .css
ve .html
herhangi onun alt dizinleri geçerli dizindeki dosyaları, herhangi onların vb alt dizinleri, (orijinal dosyaları tutmak -k
) ve (ne yaptığını söylüyorum -v
):
(shopt -s globstar; gzip -vk **/*.{css,html})
Dosya adlarını büyük / küçük harfe duyarlı olmayan şekilde eşleştirmek istiyorsanız, büyük veya küçük harfli uzantıların dahil edilmesi için nocaseglob
kabuk seçeneğini de etkinleştirebilirsiniz :
(shopt -s globstar nocaseglob; gzip -vk **/*.{css,html})
;
iki komutu ayırır ve dış (
)
kısım bir alt kabukta çalıştırılmalarına neden olur. Alt kabukta bir kabuk seçeneği ayarlamak, çağrının kabukta ayarlanmasına neden olmaz. Eğer varsa do etkinleştirmek istediğiniz globstar
ardından çalıştırabilirsiniz shopt -s globstar
; o zaman sadece komutu çalıştırabilirsiniz:
gzip -vk **/*.{css,html}
Sen devre dışı bırakabilirsiniz globstar
ile shopt -u globstar
. Şu anda ile etkin olup olmadığını kontrol edebilirsiniz shopt globstar
.
Nasıl çalışır
Bu gzip
komutun nasıl çalıştığının anahtarı , kabuğun dizin hiyerarşisinde eşleşen bir ada sahip her dosyanın bir listesini üretmek için genişletmeler gerçekleştirmesi ve ardından bu dosya adlarının her birini bağımsız değişken olarak geçirmesidir gzip
.
- Ayraç genişleme döner
**/*.{css,html}
içine **/*.css **/*.html
.
- Daha sonra globbing , bu iki kalıbı, dosya adları belirtilen son ekin ( veya bu durumda) izlediği herhangi bir şeyden ( ) oluşan geçerli dizinin altında erişilebilen (
**
nedeniyle globstar
) dosya adlarına genişletir .*
.css
.html
Bu, adları ile başlayan.
veya bu şekilde adlandırılan dizinlerde bulunan dosyalarla eşleşmez . Muhtemelen böyle bir HTML ve CSS dosyanız yok ve eğer eklerseniz, muhtemelen bunları dahil etmek istemezsiniz. Ancak bunları dahil etmek istiyorsanız, ihtiyaçlarınıza bağlı olarak bunları açıkça eşleştirebilirsiniz. Örneğin, değişen **/*.{css,html}
etmek **/{,.}*.{css,html}
ile başlayan dosyaları içerir .
hala ederken değil yapmak klasörlerde arama.
Hem adları ile başlayan dosyaların hem de adları ile başlayan .
dizinlerdeki dosyaların .
dahil edilmesini istiyorsanız, daha temiz ve basit bir yol vardır: dotglob
kabuk seçeneğini etkinleştirin .
(shopt -s globstar dotglob; gzip -vk **/*.{css,html})
Veya aşağıdakilerle başlayan dosya adlarının büyük / küçük harfe duyarsız eşleşmesini ve eşleşmesini istiyorsanız .
:
(shopt -s globstar nocaseglob dotglob; gzip -vk **/*.{css,html})
Çok nadir olsa da, **
çok uzun bir şeye genişlemek mümkündür .
Bu şekilde adlandırılmış çok sayıda dosyanız varsa , bu durum kabuğun çok uzun olacağı için komut satırını oluşturamayacağını açıklayan bir hata iletisiyle başarısız olabilir. (Binlerce dosyada bile, bu genellikle bir sorun değildir.)
gzip
hiç çağrılmaz, bu yüzden yarı iş yaparsınız.
Bu hata olursa bu konuda endişeli iseniz veya kullanabileceğiniz find
ile -exec
, ya olduğu steeldriver açıklanır (ile {} \;
) veya I (aşağıda tarif {} +
).
Sen kullanabilirsiniz find
ile -exec
eylem ve +
etkinlik için.
gzip
Komut destekleri birden fazla dosya isimleri sıkıştırılacak veriliyor. Ancak bu find
komut, iyi çalışmasına ve çok fazla dosyanız yoksa yavaş olmayacak olmasına rağmen , her dosya gzip
için komutu bir kez çalıştırır :
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} \;
Bu işe yarıyor ve kesinlikle kullanabilirsiniz. ( .
geçerli dizinden arama yapar. Bunun yanı sıra, komut satırını steeldriver'ın çok iyi cevabına yazmanın biraz farklı bir yolu ; tercih ettiğiniz stili kullanabilirsiniz.)
Ayrıca, find
birden fazla dosya adı geçebilir gzip
ve yalnızca gerektiği kadar çok çalıştırabilirsiniz - neredeyse her zaman sadece bir kez. Bunu yapmak için +
yerine kullanın\;
. +
Argüman hemen sonra gelmelidir {}
. varsa ek dosya adlarıyla find
değiştirilir +
.
find . \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
+
Yalnızca birkaç eşleşen dosya olsa bile kullanmak iyidir ve bunların birçoğu olduğunda, gzip
her dosya için ayrı bir çağırmadan belirgin şekilde daha hızlı olabilir .
Gibi steeldriver bahseder kullanabileceğiniz -iname
yerine -name
dosyaları ismi ucu gibi eşleşecek .css
ya .html
ama farklı büyük harf. Bu nocaseglob
,globstar
merkezli bir yöntem, yukarıda tarif edilen.
Son olarak, muhtemelen ile başlayan eşleşen dosya veya dizinlere sahip değilsiniz .
. Ancak bunu yaparsanız, find
bunları otomatik olarak ekler. Bunları hariç tutmak istiyorsanız ( globstar
yukarıda dotglob
kapalı olduğunda ayrıntılı olarak açıklanan -based yönteminde olduğu gibi) şunları yapabilirsiniz :
find . -not -path '*/.*' \( -name \*.css -o -name \*.html \) -exec gzip -vk {} +
globstar
Tabanlı yolu yukarıda anlatılan genel olarak başlangıçta hariç dizinleri ve dosyaları özellikle eğer, yazma daha basittir .
varsayılan beri.
Ne değil ...
Dosya adları yol ayırıcı /
ve boş karakter dışında herhangi bir karakter içerebilir . Tuhaf dosya adlarını bozan birçok teknik vardır ve genellikle her zaman çalışan tekniklerden daha karmaşıktır . Bu nedenle, sizin özel durumunuzda iyi olduklarını bildiğinizde (veya bildiğinizi düşündüğünüzde bile) bunlardan kaçınmanızı öneririm. Ve elbette gerekir Eğer boşluklar dahil özel olarak tedavi edilebilir karakterler ile dosya olabilir eğer bunları kullanmayın.
Aksi takdirde, satırlar arasına satırlar arasına boş bir karakter yerleştirmesine neden olması için kullanırsanız,find
onu işleyen başka bir komutun veya benzer bir eylemin çıktısını güvenli bir şekilde bağlamak mümkündür . Dosya adları yeni satırlar içerebilir (ancak dosyaları kasıtlı olarak bunlarla adlandırmaktan vazgeçirmeme rağmen). Eylemi içeren bir komut - o zamandan beri açık bir eylemi olmayan bulma komutları dahil-print0
find
-print
-print
, varsayılan olduğundan - dosyalar üzerinde bir eylem gerçekleştiren başka bir komuta güvenli bir şekilde iletilebilen veya başka bir şekilde sağlanabilen çıktı üretmez.
Eylem find
ile üretilen çıktı -print0
güvenli bir şekilde bağlanabilir xargs -0
( -0
bayrak xargs
boş ayırılmış girdi beklemeyi söyler ).
-r
tasarlandığı gibi çalışır. Man gzip Gönderen : Dizin yapısını tekrar tekrar seyahat. Komut satırında belirtilen dosya adlarından herhangi biri dizinse, gzip dizine iner ve orada bulduğu tüm dosyaları sıkıştırır (veya gunzip durumunda bunları açar). (Vurgu madeni)