Bir Dizindeki Tüm Dosyaları Açın


205

(Windows makinede oluşturulan) ZIP dosyaları bir dizin var. Bunları kullanarak manuel olarak açabiliyorum unzip filename, ancak geçerli klasördeki tüm ZIP dosyalarını kabuk aracılığıyla nasıl açarım?

Ubuntu Linux Server'ı kullanma.

Yanıtlar:


398

Bu bağlantıya göre bu bash'de çalışır :

sıkıştırmayı aç \ *. zip


2
Zsh ile ters eğik çizgiye ihtiyacım vardı . Bash kullanıyorsanız buna ihtiyacınız olacak bir neden bilmiyorum.
Don McCurdy

Yinelenen dosyalarla ne olacak? Sanırım sadece geçersiz kılıyor?
kerner1000

MacOS 😀
Ahi Tuna'da

1
Bunu yaparken dizindeki tüm zip dosyaları için eşleşmeyen dosya adı
alıyorum

1
Alıntılı sürüm benim için WSL'de çalıştı. Dosya adlarında da boşluklar vardı, FWIW.
Max Candocia

108

Sadece joker karakterden kaçmak için bazı alıntılar yapın:

unzip "*.zip"

2
+1 Bu benim için çalıştı. Geri kalanları kısıtlarken dosya adlarını belirli bir formatta açmak zorunda kaldım. Ben sadece çift tırnak içinde eşleşen biçimi tuttu ve çekicilik gibi çalıştı. Çıktı bana başarıyla işlenen arşiv sayısını söylüyor.
Lalit Kumar B

Ubuntu for Windows alt sisteminde güzel çalıştı, 18/18/2018. Üst yanıt işe yaramadı.
julianstanley

65

Aşağıdaki bash betiği, geçerli dizindeki tüm zip dosyalarını zip dosyasının dosya adıyla yeni dizinlere çıkarır, yani:

Aşağıdaki dosyalar:

myfile1.zip
myfile2.zip 

Ayıklanacak:

./myfile1/files...
./myfile2/files...

Kabuk betiği:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done

4
Her şeyi fethetmek için olan şey budur. Daha yüksek oy verilmediğine inanamıyorum
billynoah

Bu, dosya adlarındaki boşluklarla ilgilenmez.
David Oliver

1
Sadece "dosya adına tırnak ekleyin
CONvid19

1
`günümü kurtardı! Teşekkürler! Ben bir döngü yapıyorum, unzip, bir eylem gerçekleştirmek, kopyalama, bir şey grep, kaldırmak. Eksik olan şey, file.gz'den bash komut dosyasında bir değişken olarak dosyaya nasıl geçileceğiydi
thahgr

38

unzip * .zip veya alt klasördeyse,

find . -name "*.zip" -exec unzip {} \;

unzip joker karakter işlemesi yapar, böylece "* .zip" adlı bir dosya beklediğiniz şeyi yapmaz.
geocar

3
Aslında bu tam olarak beklenen şeyi yapacak, bulma işleminin sonucu
unzip'e geçiyor

1
Bu, geçerli dizindeki tüm zip dosyalarını ayıklayacaktır, eğer zip dosyalarının (alt klasörlerde bulunur) ilgili alt klasörlere çıkarılmasını istersem ne olur?
Rishabh Agrahari

2
@RishabhAgrahari Yorumunuzu yeni bir cevapla ele aldım .
jojo

için gzip'eddosyaları kullanmak gunzip -rfk ., ilgili klasörlerin içindeki özyinelemeli unzipping için
Devaroop

17

Tüm .zipdosyaları açın ve içeriği, aynı adla ve .zipdosyayla aynı klasörde yeni bir klasörde saklayın :

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Bu @ phatmanace'nin cevabının ve @ RishabhAgrahari'nin yorumunun adreslerinin bir uzantısı :

Bu, geçerli dizindeki tüm zip dosyalarını ayıklayacaktır, eğer zip dosyalarının (alt klasörlerde bulunur) ilgili alt klasörlere çıkarılmasını istersem ne olur?


1
için gzip'eddosyaları kullanmak gunzip -rfk ., ilgili klasörlerin içindeki özyinelemeli unzipping için
Devaroop

2
Başlarken find: illegal option -- nkullanarak UnZip 6.00 kimseye -?
DannyDannyDanny

find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Dizin listesini unuttunuz.
SaundersB

16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Bu, tüm zip arşivlerini zip arşivlerinin dosya adlarıyla adlandırılan yeni klasörlere çıkartır.

a.zip b.zip c.zipiçine fermuarını edilecek a b csırasıyla klasörler.


6

aunpack -e *.zip, atoolyüklü. Akıllıca hatalarla ilgilenme avantajına sahiptir ve zip yalnızca bir dosya içermedikçe her zaman alt dizinlere açar. Bu nedenle, unzipdizin yapısı olmayan bir zip dosyasında olduğu gibi, geçerli dizini çok sayıda dosya ile kirletme tehlikesi yoktur.


6

Herhangi bir POSIX kabuğunda, bu her zip dosyası için farklı bir dizine açılır:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done

1
Veya tek katlı olarak:for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
peterflynn



1

Dosyalar ise gzip'd. Sonra sadece kullanın:

gunzip -rfk .

orijinal dizinleri koruyarak (veya silmek -kiçin kaldır ) ilgili dizinlerdeki dosyaları özyinelemeli olarak çıkarmak için kök dizinden


0

Bu bir çeşididir Pedro Lobito cevap kullanılarak , belirli uzantı öğretileri içeren dosyaları silmek için özyinelemeli bir dizinde nasıl döngü oluşturulacağını :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done

-2
for i in `ls *.zip`; do unzip $i; done

14
Tehlikeli ls kullanımı. "-J -o -d .. jackass.zip" adlı bir dosyanız varsa
geocar


-3

kullanım

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

Linux'ta bir klasörü açmak için


Bu yalnızca tek bir dosyayı açacaktır. Soru tüm klasörleri
açmaktır

Adil olmak gerekirse, "Bir Dizindeki Tüm Dosyaları Aç" başlığı belirsiz olabilir ve "Tek bir arşivi ayrı bir dizine aç" anlamına da gelebilir.
jdersen
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.