Bir klasörde bulunan .gz dosyalarının ayıklanması


13

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.


Uzun vadede bu dizin yapısı üzerinde çalışmak zorunda kalırsanız, bu dizini birçok dizine bölün. Örneğin dosya değiştirme zamanına veya dosya adına göre.
dan

Evet, uzun vadede çalışmak zorundayım. şimdi ayıklandım ve onları alt adlarına göre üç klasöre sınıflandırmak istiyorum. Bunu yapmak için bir kabuk betiği var mı?
Lily Sharpton

Orada benzer soruları aramanızı öneririm. İhtiyaçlarınızı karşılayacak birini bulamazsanız, kendi yeni sorunuzu sorun.
dan

Yanıtlar:


25
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 .


3
Bir find, daha az gunzip!
dan

2
"+" İfadesinin bir GNUism olduğunu ve bu nedenle * BSD gibi GNU olmayan sistemlerde çalışmadığını unutmayın.
Monica'yı eski durumuna getirin - M. Schröder

3
BSD'nin sonraki sürümleri 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
plazma

7

"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

Bu -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.
gogoud

5
Hayır, komut satırına 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 .
Celada

4
Kullanmanın bir başka avantajı xargs, -Pseçenekle, birden çok gunzipişlemi paralel olarak çalıştırabilmenizdir (bu, sisteminizin kesin parametrelerine bağlı olarak) daha hızlı gidebilir.
15'te psmears

işaretçi için teşekkürler -P, @psmears. Şimdi ben de bir şeyler öğrendim!
Celada

1

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 "{}" \;

1
Bu, dosya başına bir kez gunzip yürütür. Bu verimsizliği önleyen biraz farklı bir yol için John1024'ün cevabına bakınız .
Celada

@Celada Bu kasıtlıydı; Benim endişem, + kullanmanın gunzip aşırı yüklenmesi nedeniyle tekrar bir hata mesajına yol açabilirdi. John1024'ün yöntemi işe yarıyorsa, teknik olarak daha verimlidir, ancak benim değilse çalışmalıdır.
gogoud

1
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.
Celada

1
@Celada tamam bu bilgi için teşekkürler, bu yüzden '+' gunzip ile birden fazla kez, ancak 320.000'den az kez çağrılabilir mi?
gogoud

1
doğru.
Celada


1

Ç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 {}

1
Bağımsız değişken listesi parallelçok uzun olduğu için bu başarısız olmaz mı?
user253751

@immibis Evet, asıl sorunu unuttum, yazımı güncelleyeceğim
Anthon

Argüman listesi çok uzun olduğu için bu hala başarısız olmayacak findmı?
user253751

1
evet ama tüm dosya adlarını findkomut satırından geçiriyorsunuz .
user253751

Görünüşe göre bu soruları cevaplamak için iyi bir gün değil, tartışmayı alıntılamayı unuttum-name
Anthon

-1

Bunun için kullanmak gereksizdir find, çünkü alt klasörlerden bahsetmediniz. Yapmanız gereken:

for f in *.gz;do gunzip $f;done

4
Sen do ihtiyaç findsen 320.116 yumurtlamaya istemiyorsanız gunzipsüreçleri bu döngü yaptığı gibi.
John WH Smith
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.