Yaklaşık 320116 .pdb.gz dosyaları içeren bir klasör var. Hepsini açmak istiyorum. Gunzip * .gz kullanırsam bana bir hata verir yani argüman listesi çok uzun. Klasör yaklaşık 2GB. Lütfen bana uygun bir öneri verin.
Yaklaşık 320116 .pdb.gz dosyaları içeren bir klasör var. Hepsini açmak istiyorum. Gunzip * .gz kullanırsam bana bir hata verir yani argüman listesi çok uzun. Klasör yaklaşık 2GB. Lütfen bana uygun bir öneri verin.
Yanıtlar:
find . -name '*.pdb.gz' -exec gunzip {} +
-exec gunzip {} +sağlayacak gunzipolan komut satırında birçok ancak çok fazla dosya adlarıyla. Bu, her dosya için -exec gunzip {} \;yeni bir gunzipişlem başlatandan daha etkilidir .
find, daha az gunzip!
find"+" notasyonuna izin verir. Örneğin, bakınız BSD 10.1 için man sayfalarına . OS X için de geçerlidir (en azından 10.9 ve üstü, belki daha erken). find
"Bağımsız değişken listesi çok uzun" hatalarını her aldığınızda, istediğiniz komutu her seferinde kullanmak istediğiniz bağımsız değişkenlerin bir alt kümesiyle çağırarak bu soruna geçici bir çözüm bulabilirsiniz. xargsbunu otomatik olarak yapmanıza yardımcı olan bir araçtır.
find . -type f -a -name \*.pdb.gz -print0 | xargs -0 gunzip
-execdir gunzip "{}" \;, xargs'ın her dosya için gunzip'i ayrı ayrı çağıracağı gibi aynı verimsizliğe sahip değil mi? Bu benim adam sayfasını okumam.
xargssığacak sayıda dosya adı doldurur gunzip. Dene! echo a b c d e f | xargs echoSadece çağırır echo6 argümanlarla kez zorlarsanız iken çıkış (gerçi yürütmek için oldukça yararsız komut !!!!) bir satır göreceksiniz, böylece xargssadece kullanarak komuta çağrı başına 3 argümanlar kadar tedarik echo a b c d e f | xargs -n 3 echoo zaman çıktı 2 satırlık olsun .
xargs, -Pseçenekle, birden çok gunzipişlemi paralel olarak çalıştırabilmenizdir (bu, sisteminizin kesin parametrelerine bağlı olarak) daha hızlı gidebilir.
-P, @psmears. Şimdi ben de bir şeyler öğrendim!
Bu çalışması gerektiğini düşünüyorum, her dosyanın yolunu / adını ayrı ayrı işleme için gunzip geçirir:
find /my/dir -name "*.pdb.gz" -execdir gunzip "{}" \;
findile +ve xargsaçıkça akılda tam olarak bu konuyla tasarımcı vardır. İşletim sisteminin sınırını aşmamakla birlikte, her zaman olabildiğince çok argüman sunacaklardır. Çünkü, bu arada, o ise bir işletim sistemi limiti, hiçbir ilgisi gunzip.
Bu şekilde deneyin:
find . -name '*.gz' -exec gunzip {} \;
gunzipdosya başına bir kez yürütülür . Bu verimsizliği önleyen biraz farklı bir yol için John1024'ün cevabına bakınız .
Çok çekirdekli bir makineniz varsa, muhtemelen kullanmanın gunzipmakinenizin yeteneklerini en üst düzeye çıkarmayacağını göreceksiniz . Bunun için gunzipparalel olarak birden fazla s çalıştırmanız gerekir . Hangi terminalin elle yapıldığı takip etmek zahmetlidir, ancak bunu GNU paralel ile kolayca yapabilirsiniz:
find . -name "*.gz" | parallel -X gunzip {}
parallelçok uzun olduğu için bu başarısız olmaz mı?
findmı?
findkomut satırından geçiriyorsunuz .
-name
Bunun için kullanmak gereksizdir find, çünkü alt klasörlerden bahsetmediniz. Yapmanız gereken:
for f in *.gz;do gunzip $f;done
findsen 320.116 yumurtlamaya istemiyorsanız gunzipsüreçleri bu döngü yaptığı gibi.