Dizindeki tüm dosyalar ziplensin mi?


483

Tüm dosyaları zipkomutla verilen bir dizinde sıkıştırmanın bir yolu var mı ? Kullanmayı duydum *.*, ancak onun da uzantısız dosyalar için çalışmasını istiyorum.


2
İstediğiniz dizinden bir seviye yukarı çıkmayı ve yapmayı denediniz zip myarch.zip mydir/*mi?
Joseph R.

13
ya da daha iyisizip -r myarch.zip mydir/*
Adam

25
ya da daha iyisizip -r myarch.zip mydir
ctrl-alt-delor

*.*Noktalı herhangi bir dosyayı ifade eder. Cp / m ve dos dizininde tüm dosyalar bir noktaya sahipti ve sizi yazdı (yapamadı *). Bu nedenle insanlar *.*tüm dosyaları görmeye geldi . Sonunda Microsoft, sıfır veya daha fazla noktaya sahip olabilen uzun dosya adları ekledi. Pencerelerde nokta bulunan bir dosyayı bulmak için yazmanız gerekir *.*.*.
ctrl-alt-delor

Yanıtlar:


705

Sadece kullanabilirsiniz *; Buna gerek yok *.*. Dosya uzantıları Unix'te özel değildir. *Bir nokta dahil sıfır veya daha fazla karakterle eşleşir. Böylece eşleşir foo.png, çünkü bu sıfır veya daha fazla karakterdir (yedi, kesindir).

*Varsayılan olarak, nokta ile başlayan dosyalarla eşleşmediğini unutmayın (ikisi de değil *.*). İstediğiniz genellikle budur. Değilse, bash olarak, eğer yapacaksanız shopt -s dotglob(ama yine de hariç tutulacak .ve ..). Diğer kabukların, nokta dosyaları dahil olmak üzere farklı yolları vardır (veya hiçbiri yoktur).

Alternatif olarak, zipaynı zamanda -rtüm dizin ağaçlarını aynı anda yapmak için (özyinelemeli) bir seçeneğe de sahiptir (ve nokta dosyası sorunu hakkında endişelenmenize gerek yoktur):

zip -r myfiles.zip mydir

mydirdosyalarınızı içeren dizin nerede ? Üretilen zip dosyasının, dizin yapısını ve dosyaları içereceğini unutmayın. Peterph'in yorumunda da belirtildiği gibi, bu genellikle iyi bir şey olarak görülür: zip'i çıkarmak, çıkartılan tüm dosyaları tek bir alt dizinde düzgün bir şekilde saklayacaktır.

Zip seçeneğine , -j/ --junk-pathsseçeneğiyle yolları kaydetmemesini de söyleyebilirsiniz .

zipKomut onun (birçok) tüm seçenekleri hakkında söylüyorum belgelerle birlikte gelir; man zipbu belgeleri görmek için yazın . Bu zip için benzersiz değil; Bu şekilde çoğu komut için dokümantasyon alabilirsiniz.


9
Arşivi, arşivdeki her şeyi üst düzey bir dizinde bulundurmanın iyi bir uygulama olduğunu düşünebilirsiniz - böylece kişi mevcut dizini çıkarırken kirletmez.
Peterph

@peterph yapıldı. Bu, zip dosyalarında örneğin tarfile'dekinden daha az bir kongre olmasına rağmen, korkarım.
derobert

ne yazık ki evet. Muhtemelen Windows 'un drag'n'drop' ın masaüstüne mirasından ve kaynak kodlarla çalışmanın linux mirasından dolayıdır.
Peterph

2
Unutmayın *kabuk globbing dotfiles içermez (yani. Dosya adları ile başlayan .). Bu, dizinin tamamını isme göre sıkıştırmanın başka bir avantajıdır.
mrb

Ama -r kullanmak, yaptığım şeyi kıran dizinin kendisini içeriyor. * İçermez mi .ve ..?
tkbx

11

Benim durumumda her dosyayı kendi arşivine sıkıştırmak istedim, bu yüzden aşağıdakileri yaptım (in zsh):

$ for file in *; do zip ${file%.*}.zip $file; done

1
Burada yok mkvmu? Ayrıca buradaki hiçbir şey özellikle özel değildir zsh. Her zip "${file%.*}.zip" "$file"iki değişkenin etrafında çift tırnak bulunan bir dosya adı içeren herhangi bir değişkeni uygun şekilde alıntılamak isteyeceksiniz .
üçlü

1
@ tripleee Öncelikle, hatalı referansımı gösterdiğiniz için teşekkür ederiz mkv. İkincisi, argüman alıntı yapmak zsh, aksine , gereksizdir bash. Bu yüzden bunun bir emir olduğunu belirttim zsh.
Radon Rosborough

Son noktalı virgülün bir amper ile değiştirilmesi, onu önemli ölçüde hızlandırabilir (dizindeki dosya sayısı makul ise ...). Aksi takdirde find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'( -PCPU dizilerinize bağlı olarak ayarlanmış ...) (Birçok GNU bağımlılığı ...)
Gert van den Berg

5

Başka bir yol da find ve xargs kullanmak olacaktır: (bu, zip içerisine bir "." Dizini içerebilir, ancak yine de doğru şekilde çıkarması gerekir. Denememde, zip sıkıştırma öncesi noktayı çıkardı) find . -type f -exec zip zipfile.zip {} +

( Eğer sürümünüz exec için sonu desteklemiyorsa, +bununla değiştirilebilir . Yine de daha yavaş olacaktır ...)\;find+

Bu, varsayılan olarak tüm alt dizinleri içerecektir. GNU'da bulmak -maxdepthbunu önleyebilir.


(kullanan çözümlerin aksine *, bu nokta dosyaları içerecek ve bir dizinde çok fazla dosya varsa düşmeyecektir)
Gert van den Berg

1

Bunu yapmak için başka (yavaş) bir yöntem (bir seferde zip'e bir dosya ekler):

for f in * .[^.]*; do
    [ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
    zip zipfile.zip "$f" # If directories are included, you probably want to add -r
done

Bu *( dosya eklenmiş geçici çözüm) dotfile sorunlarına sahiptir ve her dosya için bir kez zip başlatacak, arşive ekleyecektir. İçinde bashçok miktarda dosya var.

Diğer yöntemlerin çoğundan daha yavaş olacaktır, ancak nispeten basittir.


1
Bunun kabul edilen cevaptan daha az basit ve daha yavaş olduğunu söyleyebilirim; bu da “Neden bunu kimse yapar?” Sorusunu sorar. Bu soruyu cevaplayabiliyorsanız, bu bağlamı cevabınıza koymanızı öneririm, aksi halde eskiden bu sorunun iyi bir cevabı olan kötü bir cevap olduğunu düşünüyorum.
Centimane

@ Centimane: Sınırlamaları not ediyorum. Bunun eğitimsel bir değeri olduğunu düşünüyorum. (Dizinleri atlamıyorsanız, oldukça basittir). Bunun yerine (standart) harici bir araç kullanarak çok daha hızlı bir cevap istiyorsanız, diğer cevabım bunu kapsar . (dotfiles kullanımı kaldırıldı (soruda söz konusu olmadıkça doğruluğu etkiler), oldukça şık olduğunu düşünüyorum):for f in *; do zip zip.zip "$f"; done
Gert van den Berg

1
Kabul edilen yanıtın harici bir komut kullanmadığını ve daha hızlı olacağını unutmayın. Hangi senaryoda bu cevap faydalı olabilir?
Centimane

@Centimane Bash'ın parametre olarak geçirebileceğinden daha fazla dosya olduğunda tar ile. (Bulun + xargs daha iyidir, çünkü döngüler daha kolaydır ...). Bu soruya (benzersiz) bir cevaptır. Kesinlikle en uygun cevap değil. (Birisi biraz farklı bir duruma sahipse (örneğin içinde herhangi bir dizin isteniyorsa tar dosyası istemek gibi) (optimal olmayan cevaplar yine de benzer problemler için faydalı olabilir)
Gert van den Berg
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.