Her biri bir dizi zip arşivi içeren çok sayıda zip arşivim var. Bu zip arşivi ve alt zip arşivlerinde bulunan ve zip arşivlerinin kendisi olmayan tüm dosyaları özyinelemeli olarak çıkarmanın en iyi yolu nedir?
Her biri bir dizi zip arşivi içeren çok sayıda zip arşivim var. Bu zip arşivi ve alt zip arşivlerinde bulunan ve zip arşivlerinin kendisi olmayan tüm dosyaları özyinelemeli olarak çıkarmanın en iyi yolu nedir?
Yanıtlar:
Bu, içerdiği zip dosyaları hariç tüm zip dosyalarını geçerli dizine çıkarır.
find . -type f -name '*.zip' -exec unzip -- '{}' -x '*.zip' \;
Bu, içeriği geçerli dizine ayıklasa da, içerikler alt dizinler içerebileceğinden, tüm dosyalar kesinlikle bu dizinde sonuçlanmaz.
Tüm dosyaları kesinlikle geçerli dizinde istiyorsanız, çalıştırabilirsiniz.
find . -type f -mindepth 2 -exec mv -- '{}' . \;
Not: farklı dizinlerde aynı ada sahip iki dosya varsa, dosyalarda tıkanma olur.
İçinde bulunan tüm zip dosyalarını ve fermuarları özyinelemeli olarak ayıklamak isterseniz, aşağıdakiler geçerli dizindeki tüm zip dosyalarını ve içerdiği tüm fermuarları geçerli dizine ayıklar.
while [ "`find . -type f -name '*.zip' | wc -l`" -gt 0 ]
do
find . -type f -name "*.zip" -exec unzip -- '{}' \; -exec rm -- '{}' \;
done
while [ "
bulmak. tipi f-adı '*.? ar' | wc -l" -gt 0 ]; do find -type f -name "*.?ar" -exec mkdir -p '{}.dir' \; -exec unzip -d '{}.dir' -- '../{}' \; -exec rm -- '{}' \;; done
Anladığım kadarıyla, kendilerinde zip arşivleri içeren zip arşivleriniz var ve her çıkarıldığında iç içe fermuarları açmak istiyorsunuz.
Burada, geçerli dizindeki ve alt dizinlerindeki tüm fermuarları yinelemeli olarak açan, her zip dosyasını sıkıştırıldıktan sonra kaldırır ve zip dosyaları olduğu sürece devam eden bir bash 4 betiği. Bir alt dizindeki bir zip dosyası o alt dizine göre çıkarılır. Uyarı: denenmemişse, denemeden önce orijinal dosyaları yedekleyin veya rm
zip dosyasını dizin ağacının dışına taşıyarak değiştirin .
shopt -s globstar nullglob
while set -- **/*.zip; [ $# -ge 1 ] do
for z; do
( cd -- "$(dirname "$z")" &&
z=${z##*/} &&
unzip -- "$z" &&
rm -- "$z"
)
done
done
shopt
Satırı değiştirdiğinizde komut dosyası da zsh biçiminde çalışır setopt nullglob
.
İşte taşınabilir bir eşdeğeri. Sonlandırma koşulu biraz karmaşıktır, çünkü find
herhangi bir dosya bulup bulmadığını kendiliğinden döndürmez. Uyarı: yukarıdaki gibi.
while [ -n "$(find . -type f -name '*.zip' -exec sh -c '
cd "${z%/*}" &&
z=${z##*/} &&
unzip -- "$z" 1>&2 &&
rm -- "$z" &&
echo 1
')" ]; do :; done
unzip
bunu yapmaz, çünkü UNIX yolu bir şeyi yapmak ve bunu iyi yapmaktır, her araçtaki tüm çılgın özel durumları ele almamaktır. Bu nedenle, kabuğu kullanmanız gerekir (bu da "şeyleri birbirine bağlamak" işini iyi yapar). Bu bir programlama sorusu yapar ve StackOverflow'da TÜM olası programlama soruları yanıtlandığından, burada: Bir dizindeki ve alt dizinlerindeki arşivleri Unix komut satırından yinelemeli olarak nasıl açabilirsiniz ?
Bu perl betiği her bir .zip dosyasını kendi alt dizinine ayıklayacaktır. İç içe geçmiş zip dosyalarını işlemek için komut dosyasını birden çok kez çalıştırın. Ayıklandıktan sonra .zip dosyalarını silmez, ancak bir unlink () çağrısı ekleyerek bu değişikliği yapabilirsiniz.
#!/usr/bin/perl -w
# This script unzips all .zip files it finds in the current directory
# and all subdirectories. Contents are extracted into a subdirectory
# named after the zip file (eg. a.zip is extracted into a/).
# Run the script multiple times until all nested zip files are
# extracted. This is public domain software.
use strict;
use Cwd;
sub process_zip {
my $file = shift || die;
(my $dir = $file) =~ s,/[^/]+$,,;
(my $bare_file = $file);
$bare_file =~ s,.*/,,;
my $file_nopath = $bare_file;
$bare_file =~ s,\.zip$,,;
my $old_dir = getcwd();
chdir($dir) or die "Could not chdir from '$old_dir' to '$dir': $!";
if (-d $bare_file) {
chdir($old_dir);
# assume zip already extracted
return;
}
mkdir($bare_file);
chdir($bare_file);
system("unzip '../$file_nopath'");
chdir($old_dir);
}
my $cmd = "find . -name '*.zip'";
open(my $fh, "$cmd |") or die "Error running '$cmd': $!";
while(<$fh>) {
chomp;
process_zip($_);
}
En kolay yol atool kullanmaktır: http://www.nongnu.org/atool/ Herhangi bir arşivi çıkarmak için zip, unzip, katran, rar vb. Programları kullanan çok iyi bir betiktir .
Kullan atool -x package_name.zip
hepsini halletmek veya birçok zip dosyaları ile dizine kullanmak istiyorsanız basit kullanmak for
döngü:
for f in *; do atool -x $f; fi
(bunu cd
kullanmadan önce zip dosyalarıyla istediğiniz dizine girmeniz gerekir).
atool
Buradaki davranışı unzip'ten önemli ölçüde farklı değil diyebilirim, ZIP dosyalarını özyinelemeli olarak da çıkarmaz.
Zip dosyalarının içindeki zip dosyalarını otomatik olarak açarken dikkatli olmak istersiniz:
http://research.swtch.com/2010/03/zip-files-all-way-down.html
Çıktı olarak bir zip dosyası üreten, çıktı olarak bir zip dosyası vb. Üreten bir zip dosyası oluşturmak mümkündür. Yani, programı "unzip" sabit bir merhem olan bir zip dosyası yapabilirsiniz.
Ayrıca, "patlayabilir" zip dosyaları yapma insanlar hatırlıyorum gibi, çok küçük bir zip dosyası çoklu gigabayt çıktı için unzip olacaktır. Bu, sıkıştırma yönteminin bir yönüdür.
Belki bu yardımcı olacaktır (benim için çalıştı):
function unzipAll(){
# find and count archives
archLst=`find . -type f -name "*.*ar"`
archLstSize=`echo $archLst| awk 'END{print NF}'`
# while archives exists do extract loop
while [ "$archLstSize" -gt 0 ]; do
# extract and remove all archives (found on single iteration)
for x in $archLst; do
mv "${x}" "${x}_";
unzip "${x}_" -d "${x}" && rm "${x}_";
done; #EO for
# find and count archives
archLst=`find . -type f -name "*.*ar"`
archLstSize=`echo $archLst| awk 'END{print NF}'`
done #EO while
}
Klasör yapısını korumak, her şeyi üst düzey dizine açmak değil, 2010'dan beri Giles gibi bir çözüme ihtiyacım vardı. İşte üç satır eklendi / değişti onun üzerine benim almak:
#!/bin/bash
shopt -s globstar nullglob
while set -- **/*.zip; [ $# -ge 1 ]
do
for z
do
( cd -- "$(dirname "$z")" &&
z=${z##*/} &&
cp -- "$z" "$z".bak &&
mkdir -- "$z"dir &&
unzip -- "$z" -d "$z"dir &&
rm -- "$z"
)
done
done
Java tabanlı bu yardımcı programa göz atın Yuvalanmış zip dosyaları için nzip atın . Yuvalanmış fermuarların çıkarılması ve sıkıştırılması aşağıdaki komutlar kullanılarak kolayca yapılabilir
java -jar nzip.jar -c list -s readme.zip
java -jar nzip.jar -c özü -s "C: \ project \ readme.zip" -t benioku
java -jar nzip.jar -c sıkıştır -s benioku -t "C: \ proje \ readme.zip"
PS. Ben yazarım ve hataları hızlı bir şekilde düzeltmekten mutluluk duyacağım.