распаковка zip архивов (каждый в свою папку)
Модераторы: /dev/random, Модераторы разделов
-
Tigra
- Сообщения: 146
- ОС: Gentoo
распаковка zip архивов
в каталоге куча зипованых архивов, какой командой можно распаковать все, каждый в папку равной названию архива?
-
watashiwa_daredeska
- Бывший модератор
- Сообщения: 4038
- Статус: Искусственный интеллект (pre-alpha)
- ОС: Debian GNU/Linux
Re: распаковка zip архивов
Код: Выделить всё
for z in *.zip; do d="${z%.zip}"; (mkdir "$d" && cd "$d" && unzip "../$z"); doneМои розовые очки
Спасибо сказали:
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
-
sgfault
- Сообщения: 586
- Статус: -
Re: распаковка zip архивов
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 архивов
Я ленив и не люблю забивать голову всякой ненужной чепухой, вроде опций, которые экономят пару нажатий из ста. Ср. unzip "$z" -d "$d" и (cd "$d";unzip "$z").
Мои розовые очки
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: распаковка zip архивов
watashiwa_darede... писал(а): ↑01.03.2010 17:40for 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"-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: распаковка zip архивов
у кого короче (улыбка)?
Код: Выделить всё
mkdir 0; for i in *.zip; do mkdir 0/"$i"; unzip -d 0/"$i" "$i"; doneПисать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
sgfault
- Сообщения: 586
- Статус: -
Re: распаковка zip архивов
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 архивов
что будет с мултипартами ?
sash-kan - в mkdir нет надобности, а вот с фором - эка какие все смелые
sash-kan - в mkdir нет надобности, а вот с фором - эка какие все смелые
Я конечно далек от мысли...(с)
-
sgfault
- Сообщения: 586
- Статус: -
-
eddy
- Сообщения: 3321
- Статус: Красный глаз тролля
- ОС: ArchLinux
Re: распаковка zip архивов
Пробелы в имени файла. Надо или сначала делать ls -1 в файл, и из него считывать, или использовать find
RTFM
-------
KOI8-R - патриотичная кодировка
-------
KOI8-R - патриотичная кодировка
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: распаковка zip архивов
что-то не въехал
или sed. но можно и без файлов, если с sed...
ЗЫЖ моя ls, и так -1, если её в файл или поток.
-
sash-kan
- Администратор
- Сообщения: 13939
- Статус: oel ngati kameie
- ОС: GNU
Re: распаковка zip архивов
хм.
upd. точнее, есть. явно сказано: каталог должен быть «равным» названию архива. что у меня и реализовано: "blabla.zip" == "blabla.zip".
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в условиях задачи этого нет.
upd. точнее, есть. явно сказано: каталог должен быть «равным» названию архива. что у меня и реализовано: "blabla.zip" == "blabla.zip".
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
при сбоях форума см.блог
-
sgfault
- Сообщения: 586
- Статус: -
Re: распаковка zip архивов
Как, впрочем, уже заметил 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', который будет выполнен последним.
Ясно.
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: распаковка zip архивов
Да у меня короче, что вы спорите?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 архивов
Код: Выделить всё
for i in `echo *.zip`...далее сами думайте как возможно такое же при - for i in *.zip ...
Я конечно далек от мысли...(с)
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: распаковка zip архивов
что-то я перестаю вас понимать - это-же ещё сложнее очевидного
ls | ...
Зачем?
bash: dtrx: command not found
ну а такой вариант?
Код: Выделить всё
$ 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-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: распаковка zip архивов
А что, в вопросе было требование "средствами базовой системы"? (;
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
sgfault
- Сообщения: 586
- Статус: -
Re: распаковка zip архивов
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 архивов
нет. это всего-лишь недостаток вашего решения (в остальном - идеального).
-
smaharbA
- Сообщения: 229
- ОС: Windows Vista
Re: распаковка zip архивов
Код: Выделить всё
gw1:~/bin# cat lll; ./lll
#!/bin/sh
for i in `echo *.zip`; do
echo $i
done
пробел
два.zip
пробел
раз.zipЯ конечно далек от мысли...(с)
-
sgfault
- Сообщения: 586
- Статус: -
Re: распаковка zip архивов
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 архивов
Код: Выделить всё
gw1:~/bin# ls -1 *.zip
пробел два.zip
пробел раз.zip
gw1:~/bin# find *.zip -exec unzip '{}' -d'{}.unzip' \;Я конечно далек от мысли...(с)
-
sgfault
- Сообщения: 586
- Статус: -
Re: распаковка zip архивов
Это.. я вас не понимаю. Если это файлы
то разве это правильная работа?
Или вы вообще что-то другое имели в виду?
smaharbA писал(а): ↑02.03.2010 17:33Код: Выделить всё
gw1:~/bin# ls -1 *.zip пробел два.zip пробел раз.zip
то разве это правильная работа?
Или вы вообще что-то другое имели в виду?
-
phoque
- Сообщения: 5
-
Ingvar16
- Сообщения: 36
- ОС: Debian Squeeze
Re: распаковка zip архивов
А как сделать то же для *.rar ?
Решение dtrx *.rar не подходит,потому что в архивах,где файлы с русскими названиями обрезает расширение файла.
Решение dtrx *.rar не подходит,потому что в архивах,где файлы с русскими названиями обрезает расширение файла.
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: распаковка zip архивов
Взять цикл sash-kan'a и заменить zip на rar, а unzip на unrar?
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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
Ingvar16
- Сообщения: 36
- ОС: Debian Squeeze
Re: распаковка zip архивов
Проблема в том ,что в unrar нет параметра "-d" как в unzip,чтобы распаковать в субдиректорию
-
SLEDopit
- Модератор
- Сообщения: 4824
- Статус: фанат консоли (=
- ОС: GNU/Debian, RHEL
Re: распаковка zip архивов
Э, ну наверно. Я им последний раз года 2 назад пользовался.
Ну в таком случае, Вам подойдет вариант watashiwa_daredeska
Ну в таком случае, Вам подойдет вариант watashiwa_daredeska
watashiwa_daredeska писал(а): ↑01.03.2010 17:40for 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.
The more you believe you don't do mistakes, the more bugs are in your code.
-
ZyX
- Сообщения: 355
- ОС: Gentoo
Re: распаковка zip архивов
Так, только на 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 будет тот же самый.