распаковка zip архивов (каждый в свою папку)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Tigra
Сообщения: 146
ОС: Gentoo

распаковка zip архивов

Сообщение Tigra »

в каталоге куча зипованых архивов, какой командой можно распаковать все, каждый в папку равной названию архива?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: распаковка zip архивов

Сообщение watashiwa_daredeska »

Код: Выделить всё

for z in *.zip; do d="${z%.zip}"; (mkdir "$d" && cd "$d" && unzip "../$z"); done
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: распаковка zip архивов

Сообщение t.t »

dtrx
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

watashiwa_daredeska писал(а):
01.03.2010 17:40

Код: Выделить всё

for z in *.zip; do d="${z%.zip}"; (mkdir "$d" && cd "$d" && unzip "../$z"); done

Интересно, вы используете `cd` просто так или в этом есть какой-то особый смысл? :-) Т.е что-то вроде этого

Код: Выделить всё

 ... && unzip "$z" -d "$d"

будет чем-то принципиально отличаться от вашего варианта?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: распаковка zip архивов

Сообщение watashiwa_daredeska »

sgfault писал(а):
01.03.2010 18:39
Интересно, вы используете `cd` просто так или в этом есть какой-то особый смысл?
Я ленив и не люблю забивать голову всякой ненужной чепухой, вроде опций, которые экономят пару нажатий из ста. Ср. unzip "$z" -d "$d" и (cd "$d";unzip "$z").
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: распаковка zip архивов

Сообщение drBatty »

watashiwa_darede... писал(а):
01.03.2010 17:40
for z in *.zip; do d="${z%.zip}"; (mkdir "$d" && cd "$d" && unzip "../$z"); done

а можно мне?!

Код: Выделить всё

ls *.zip | sed -r "s~(.*)(\.zip)$~mkdir '\1'; cd '\1'; unzip '../\1\2'~e"
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: распаковка zip архивов

Сообщение sash-kan »

у кого короче (улыбка)?

Код: Выделить всё

mkdir 0; for i in *.zip; do mkdir 0/"$i"; unzip -d 0/"$i" "$i"; done
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

sash-kan писал(а):
01.03.2010 23:13
у кого короче (улыбка)?

Код: Выделить всё

mkdir 0; for i in *.zip; do mkdir 0/"$i"; unzip -d 0/"$i" "$i"; done

sash-kan,
это.. но ведь в "i" у вас имя файла, а не имя директории. Но тогда

Код: Выделить всё

mkdir 0/"$i"

неправильно (нужно стереть .zip из i). Или я что-то пропустил ? :-)
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: распаковка zip архивов

Сообщение smaharbA »

что будет с мултипартами ?

sash-kan - в mkdir нет надобности, а вот с фором - эка какие все смелые
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

smaharbA писал(а):
01.03.2010 23:48
а вот с фором - эка какие все смелые

а что с ним не так?
Спасибо сказали:
Аватара пользователя
eddy
Сообщения: 3321
Статус: Красный глаз тролля
ОС: ArchLinux

Re: распаковка zip архивов

Сообщение eddy »

sgfault писал(а):
01.03.2010 23:59
а что с ним не так?

Пробелы в имени файла. Надо или сначала делать ls -1 в файл, и из него считывать, или использовать find
RTFM
-------
KOI8-R - патриотичная кодировка Изображение
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: распаковка zip архивов

Сообщение drBatty »

sash-kan писал(а):
01.03.2010 23:13
у кого короче (улыбка)?
CODE
mkdir 0; for i in *.zip; do mkdir 0/"$i"; unzip -d 0/"$i" "$i"; done

что-то не въехал :(
eddy писал(а):
02.03.2010 00:02
Пробелы в имени файла. Надо или сначала делать ls -1 в файл, и из него считывать, или использовать find

или sed. но можно и без файлов, если с sed...

ЗЫЖ моя ls, и так -1, если её в файл или поток.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: распаковка zip архивов

Сообщение sash-kan »

хм.

Shell

$ touch "file with blanks.bla" $ touch "another file with blanks.bla" $ mkdir 0 $ for i in *.bla; do mkdir 0/"$i"; done $ ls -l 0 total 8 drwxr-xr-x 2 al al 4096 2010-03-02 03:55 another file with blanks.bla drwxr-xr-x 2 al al 4096 2010-03-02 03:55 file with blanks.bla $ ls -l total 4 drwxr-xr-x 4 al al 4096 2010-03-02 03:55 0 -rw-r--r-- 1 al al 0 2010-03-02 03:54 another file with blanks.bla -rw-r--r-- 1 al al 0 2010-03-02 03:53 file with blanks.bla


sgfault писал(а):
01.03.2010 23:37
неправильно (нужно стереть .zip из i).
в условиях задачи этого нет.
upd. точнее, есть. явно сказано: каталог должен быть «равным» названию архива. что у меня и реализовано: "blabla.zip" == "blabla.zip".
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

eddy писал(а):
02.03.2010 00:02
sgfault писал(а):
01.03.2010 23:59
а что с ним не так?

Пробелы в имени файла. Надо или сначала делать ls -1 в файл, и из него считывать, или использовать find

Как, впрочем, уже заметил sash-kan, едва ли пробелы станут проблемой (http://www.gnu.org/software/bash/manual/ba...hell-Expansions):

Код: Выделить всё

The order of expansions is: brace expansion, tilde expansion, parameter, variable, and arithmetic expansion and command substitution (done in a left-to-right fashion), word splitting, and filename expansion.


Разбить результат звездочки по пробелам (содержащимся в именах файлов) может только 'word splitting', но во время 'word splitting'-а звездочка будет все еще звездочкой, тк звездочку заменит 'filename expansion', который будет выполнен последним.


sash-kan писал(а):
02.03.2010 04:00
sgfault писал(а):
01.03.2010 23:37
неправильно (нужно стереть .zip из i).
в условиях задачи этого нет.
upd. точнее, есть. явно сказано: каталог должен быть «равным» названию архива. что у меня и реализовано: "blabla.zip" == "blabla.zip".

Ясно.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: распаковка zip архивов

Сообщение t.t »

sash-kan писал(а):
01.03.2010 23:13
у кого короче (улыбка)?

Код: Выделить всё

mkdir 0; for i in *.zip; do mkdir 0/"$i"; unzip -d 0/"$i" "$i"; done
Да у меня короче, что вы спорите?

Код: Выделить всё

 dtrx *.zip
(;
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: распаковка zip архивов

Сообщение smaharbA »

Код: Выделить всё

for i in `echo *.zip`...


далее сами думайте как возможно такое же при - for i in *.zip ...
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: распаковка zip архивов

Сообщение drBatty »

smaharbA писал(а):
02.03.2010 14:21
далее сами думайте как возможно такое же при - for i in *.zip ...

что-то я перестаю вас понимать - это-же ещё сложнее очевидного
ls | ...
Зачем?
t.t писал(а):
02.03.2010 13:43
dtrx *.zip

bash: dtrx: command not found
Tigra писал(а):
01.03.2010 17:37
какой командой можно распаковать все, каждый в папку равной названию архива?

ну а такой вариант?

Код: Выделить всё

$ mkdir 0; ls *.zip|sed -r "s~.*~mkdir 0/&; unzip -d '0/&' '&'~e"
Archive:  a.zip
 extracting: 0/a.zip/1.txt
Archive:  b.zip
 extracting: 0/b.zip/1.txt
Archive:  c.zip
 extracting: 0/c.zip/1.txt
$ ll 0 -R
0:
итого 12
drwxr-xr-x 2 drb users 4096 2010-03-02 15:22 a.zip/
drwxr-xr-x 2 drb users 4096 2010-03-02 15:22 b.zip/
drwxr-xr-x 2 drb users 4096 2010-03-02 15:22 c.zip/

0/a.zip:
итого 0
-rw-r--r-- 1 drb users 0 2010-03-01 19:15 1.txt

0/b.zip:
итого 0
-rw-r--r-- 1 drb users 0 2010-03-01 19:15 1.txt

0/c.zip:
итого 0
-rw-r--r-- 1 drb users 0 2010-03-01 19:15 1.txt
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: распаковка zip архивов

Сообщение t.t »

drBatty писал(а):
02.03.2010 15:16
t.t писал(а):
02.03.2010 13:43
dtrx *.zip

bash: dtrx: command not found
А что, в вопросе было требование "средствами базовой системы"? (;
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

smaharbA писал(а):
02.03.2010 14:21

Код: Выделить всё

for i in `echo *.zip`...


далее сами думайте как возможно такое же при - for i in *.zip ...

Ваш вариант с `echo`, если в именах файлов есть пробелы, вообще работать не будет, в отличие от варианта без echo.

Код: Выделить всё

bash-4.0# touch "a b" "c  d"
bash-4.0# ls -1
a b
c  d
bash-4.0# for i in *; do echo "-$i-"; done
-a b-
-c  d-
bash-4.0# for i in `echo *`; do echo "-$i-"; done
-a-
-b-
-c-
-d-


Работать ваш вариант с echo и не может (man bash), тк:

Код: Выделить всё

      The  order  of  expansions  is: brace expansion, tilde expansion, parameter,
       variable and arithmetic expansion and command substitution (done in a  left-
       to-right fashion), word splitting, and pathname expansion.

Код: Выделить всё

       If  the  substitution appears within double quotes, word splitting and path-
       name expansion are not performed on the results.

те в варианте с echo после command substitution будет выполнен word splitting (тк нет двойных кавычек) по пробелам подставленных имен файлов. .В варианте без echo word splitting для имен файлов не выполняется, и все работает правильно.

причем исправить добавлением двойных кавычек тоже нельзя (word splitting не выполняется совсем и все файлы написаны в одну строку):

Код: Выделить всё

bash-4.0# for i in "`echo *`"; do echo "-$i-"; done
-a b c  d-



Код: Выделить всё

bash-4.0# bash --version
GNU bash, version 4.0.0(2)-release (i486-slackware-linux-gnu)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: распаковка zip архивов

Сообщение drBatty »

t.t писал(а):
02.03.2010 15:27
А что, в вопросе было требование "средствами базовой системы"? (;

нет. это всего-лишь недостаток вашего решения (в остальном - идеального).
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: распаковка zip архивов

Сообщение smaharbA »

Код: Выделить всё

gw1:~/bin# cat lll; ./lll
#!/bin/sh

for i in `echo *.zip`; do
    echo $i
done
пробел
два.zip
пробел
раз.zip
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

smaharbA писал(а):
02.03.2010 16:58

Код: Выделить всё

gw1:~/bin# cat lll; ./lll
#!/bin/sh

for i in `echo *.zip`; do
    echo $i
done
пробел
два.zip
пробел
раз.zip

Напишите полные имена файлов, которые цикл перечисляет.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: распаковка zip архивов

Сообщение smaharbA »

Код: Выделить всё

gw1:~/bin# ls -1 *.zip
пробел два.zip
пробел раз.zip
gw1:~/bin# find *.zip -exec unzip '{}' -d'{}.unzip' \;
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: распаковка zip архивов

Сообщение sgfault »

Это.. я вас не понимаю. Если это файлы
smaharbA писал(а):
02.03.2010 17:33

Код: Выделить всё

gw1:~/bin# ls -1 *.zip
пробел два.zip
пробел раз.zip

то разве это правильная работа?
smaharbA писал(а):
02.03.2010 16:58

Код: Выделить всё

пробел
два.zip
пробел
раз.zip

Или вы вообще что-то другое имели в виду?

Спасибо сказали:
Аватара пользователя
phoque
Сообщения: 5

Re: распаковка zip архивов

Сообщение phoque »

t.t писал(а):
01.03.2010 18:06
dtrx

Спасибо. Действительно: зачем городить каждый раз for если все написано за нас.
P.S. Как же много маленьких полезных программ о которых узнаешь случайно и не сразу.
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

Re: распаковка zip архивов

Сообщение Ingvar16 »

А как сделать то же для *.rar ?
Решение dtrx *.rar не подходит,потому что в архивах,где файлы с русскими названиями обрезает расширение файла.
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: распаковка zip архивов

Сообщение SLEDopit »

Ingvar16 писал(а):
22.10.2011 00:57
А как сделать то же для *.rar ?
Взять цикл sash-kan'a и заменить zip на rar, а unzip на unrar?
sash-kan писал(а):
01.03.2010 23:13
mkdir 0; for i in *.zip *.rar; do mkdir 0/"$i"; unzip unrar -d 0/"$i" "$i"; done
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

Re: распаковка zip архивов

Сообщение Ingvar16 »

SLEDopit писал(а):
22.10.2011 03:36
Ingvar16 писал(а):
22.10.2011 00:57
А как сделать то же для *.rar ?
Взять цикл sash-kan'a и заменить zip на rar, а unzip на unrar?
sash-kan писал(а):
01.03.2010 23:13
mkdir 0; for i in *.zip *.rar; do mkdir 0/"$i"; unzip unrar -d 0/"$i" "$i"; done



Проблема в том ,что в unrar нет параметра "-d" как в unzip,чтобы распаковать в субдиректорию :(
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: распаковка zip архивов

Сообщение SLEDopit »

Э, ну наверно. Я им последний раз года 2 назад пользовался.
Ну в таком случае, Вам подойдет вариант watashiwa_daredeska
watashiwa_daredeska писал(а):
01.03.2010 17:40
for z in *.ziprar; do d="${z%.ziprar}"; (mkdir "$d" && cd "$d" && unzip unrar "../$z"); done
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: распаковка zip архивов

Сообщение ZyX »

SLEDopit писал(а):
22.10.2011 03:36
Ingvar16 писал(а):
22.10.2011 00:57
А как сделать то же для *.rar ?
Взять цикл sash-kan'a и заменить zip на rar, а unzip на unrar?
sash-kan писал(а):
01.03.2010 23:13
mkdir 0; for i in *.zip *.rar; do mkdir 0/"$i"; unzip unrar -d 0/"$i" "$i"; done


Так, только на 7z, а не на unrar:

(Created by format.vim)

mkdir O for a in *.rar ; do mkdir O/$a 7z x -oO/$a $a done


Код для zip, cab, arj, tar будет тот же самый.
Спасибо сказали: