Globstar kullanabilirsiniz.
İle globstarkabuk seçeneği etkin, tüm ihtiyaç vardır gzip -vk **/*.{css,html}.
Bash kabuğu, globstartekrarlayan globları yazmanıza izin veren bir seçeneğe sahiptir **. shopt -s globstarsağ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 gziphepsi .cssve .htmlherhangi 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 nocaseglobkabuk 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 globstarardından çalıştırabilirsiniz shopt -s globstar; o zaman sadece komutu çalıştırabilirsiniz:
gzip -vk **/*.{css,html}
Sen devre dışı bırakabilirsiniz globstarile shopt -u globstar. Şu anda ile etkin olup olmadığını kontrol edebilirsiniz shopt globstar.
Nasıl çalışır
Bu gzipkomutun 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: dotglobkabuk 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 findile -exec, ya olduğu steeldriver açıklanır (ile {} \;) veya I (aşağıda tarif {} +).
Sen kullanabilirsiniz findile -execeylem ve +etkinlik için.
gzipKomut destekleri birden fazla dosya isimleri sıkıştırılacak veriliyor. Ancak bu findkomut, iyi çalışmasına ve çok fazla dosyanız yoksa yavaş olmayacak olmasına rağmen , her dosya gzipiç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, findbirden fazla dosya adı geçebilir gzipve 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 finddeğ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, gzipher dosya için ayrı bir çağırmadan belirgin şekilde daha hızlı olabilir .
Gibi steeldriver bahseder kullanabileceğiniz -inameyerine -namedosyaları ismi ucu gibi eşleşecek .cssya .htmlama 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, findbunları otomatik olarak ekler. Bunları hariç tutmak istiyorsanız ( globstaryukarıda dotglobkapalı 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 {} +
globstarTabanlı 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-print0find-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 findile üretilen çıktı -print0güvenli bir şekilde bağlanabilir xargs -0( -0bayrak xargsboş ayırılmış girdi beklemeyi söyler ).
-rtasarlandığı 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)