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

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

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

Ingvar16
Сообщения: 36
ОС: Debian Squeeze

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

Сообщение Ingvar16 »

ZyX писал(а):
22.10.2011 07:33
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 будет тот же самый.


Спасибо большое.Работает,но делает ошибки,если название архива с пробелами.Так работает хорошо:

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

#!/bin/bash

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



Вот ещё нашёл рабочий вариант с unrar в Интернете:

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

#!/bin/bash

IFS="
"

for FILE_NAME in *.[Rr][Aa][Rr]
do
        echo -n "unpack $FILE_NAME..."
        DIR_NAME="$FILE_NAME.dir"
        mkdir $DIR_NAME || exit $?
        cd $DIR_NAME || exit $?
        unrar x ../$FILE_NAME || exit $?
        cd .. || exit $?
        echo " OK!"
done


И уже для полного исполнения желаний,может кто подскажет,как в созданных папках переименовать файлы с расширением *.djvu и *.pdf,присвоив им имя папки (т.е.имя изначальных архивов).
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

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

Сообщение allez »

Ingvar16 писал(а):
22.10.2011 14:11
Работает,но делает ошибки,если название архива с пробелами.

Для устранения подобного рода ошибок следует заключать переменные в кавычки:

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

mkdir O
for a in *.rar ; do
    mkdir O/"$a"
    7z x -oO/"$a" "$a"
done
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

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

Сообщение ZyX »

allez писал(а):
22.10.2011 14:54
Ingvar16 писал(а):
22.10.2011 14:11
Работает,но делает ошибки,если название архива с пробелами.

Для устранения подобного рода ошибок следует заключать переменные в кавычки:

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

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


Или использовать zsh и забыть об этой фигне.
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

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

Сообщение Ingvar16 »

А как в созданных папках переименовать файлы с расширением *.djvu и *.pdf,присвоив им имя папки (т.е.имя изначальных архивов) ?
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

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

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

Ingvar16 писал(а):
29.10.2011 01:50
А как в созданных папках переименовать файлы с расширением
точно так же, как в мамках с заужением:
$ ls testrename
some long file name.pdf
$ cat testrename.sh
#!/bin/bash
mv "$(ls $1/*.pdf)" "$1/$1.pdf"

$ bash testrename.sh testrename
$ ls testrename
testrename.pdf
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

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

Сообщение Ingvar16 »

to sash-kan:

Спасибо,но что-то не очень работает:

$ ls Bychkov-Ledovoe-poboische/
Бычков - Ледовое побоище и дрyгие «мифы».pdf
$ cat pdfrename.sh
#!/bin/bash
mv "$(ls $1/*.pdf)" "$1/$1.pdf"

$ bash pdfrename.sh Bychkov-Ledovoe-poboische/
mv: невозможно переместить «Bychkov-Ledovoe-poboische//Бычков - Ледовое побоище и дрyгие «мифы\».pdf» в «Bychkov-Ledovoe-poboische//Bychkov-Ledovoe-poboische/.pdf»: Нет такого файла или каталога

$ ls Bychkov-Ledovoe-poboische/
Бычков - Ледовое побоище и дрyгие «мифы».pdf
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit »

Ingvar16 писал(а):
29.10.2011 14:51
$ bash pdfrename.sh Bychkov-Ledovoe-poboische/
Вы запускаете неправильно. Там / в конце не нужен. Из-за этого и не работает.

зы Данный скрипт отработает только при условии, что в каждой директории ровно один файл с заданным расширением, в противном случае скрипт выдаст ошибку.

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

 $ mkdir test
 $ touch test/{1,2,3,4,5}.txt
 $ ls test
1.txt  2.txt  3.txt  4.txt  5.txt
 $ echo '#!/bin/bash
> mv "$(ls $1/*.txt)" "$1/$1.txt"' > testrename.sh
 $ bash testrename.sh test
mv: cannot stat `test/1.txt\ntest/2.txt\ntest/3.txt\ntest/4.txt\ntest/5.txt': No such file or directory
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 писал(а):
29.10.2011 14:56
Ingvar16 писал(а):
29.10.2011 14:51
$ bash pdfrename.sh Bychkov-Ledovoe-poboische/
Вы запускаете неправильно. Там / в конце не нужен. Из-за этого и не работает.

зы Данный скрипт отработает только при условии, что в каждой директории ровно один файл с заданным расширением, в противном случае скрипт выдаст ошибку.

Спасибо,без слеша работает(я его не ставил,просто нажал ТАВ).

Как же мне написать скрипт,чтобы обработать все архивы rar в каталоге (включая все подкаталоги) таким образом:

1)распаковать все, каждый в папку с названием ,равным названию архива
2)переименовать файлы с расширением djvu,pdf,doc в папках из п.1 по названию папки (если файлов несколько,добавить номер 1,2 и т.д.).
3)В имени файлов могут быть пробелы.
4)Архивы обычные (не многотомные).
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit »

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

#!/bin/bash
mkdir O
for a in *.rar ; do
    mkdir O/"$a"
    7z x -oO/"$a" "$a"
    index=0;
    for file in O/"$a"/*{doc,pdf,txt} ; do
        echo mv "$file" O/"$a/${a}_$index.${file//*.}"
        (( index++ ))
    done
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 »

Вот так работает:

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

#!/bin/bash
mkdir O
for a in *.rar ; do
    mkdir O/"$a"
    7z x -oO/"$a" "$a"
    index=0;
    for file in O/"$a"/*.{doc,pdf,djvu,fb2} ; do
        mv "$file" O/"$a/${a}_$index.${file//*.}"
                        (( index++ ))
        done
done


а с

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

echo mv "$file" O/"$a/${a}_$index.${file//*.}"
        (( index++ ))


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

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

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

Ingvar16 писал(а):
29.10.2011 16:13
Вот так работает:

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

#!/bin/bash
mkdir O
for a in *.rar ; do
    mkdir O/"$a"
    7z x -oO/"$a" "$a"
    index=0;
    for file in O/"$a"/*.{doc,pdf,djvu,fb2} ; do
        mv "$file" O/"$a/${a}_$index.${file//*.}"
        done
done


а с

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

echo mv "$file" O/"$a/${a}_$index.${file//*.}"
        (( index++ ))


не переименовывает в распакованных папках :(
Команда echo это вывод текста. Она была добавлена, чтобы посмотреть, что получится. Для реальной работы она, конечно же, не нужна.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

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

Сообщение sgfault »

SLEDopit писал(а):
29.10.2011 15:49

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

#!/bin/bash
mkdir O
for a in *.rar ; do
    mkdir O/"$a"
    7z x -oO/"$a" "$a"
    index=0;
    for file in O/"$a"/*{doc,pdf,txt} ; do
        echo mv "$file" O/"$a/${a}_$index.${file//*.}"
        (( index++ ))
    done
done
как-то так.


Ерунда, конечно, но все же: в чем смысл двух слешей в '${file//*.}' ? Ведь ваш pattern ('*.') в любом случае совпадет только один раз. Даже, более того, в чем смысл замены (pattern substitution), если фактически вы просто удаляете префикс (те в точности '${file##*.}') ? Или я просто неправильно понял ваш скрипт.. (запускать не пробовал)
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

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

Сообщение Ingvar16 »

Вот добрые люди (sin) подкинули такое решение,но он у меня не работает.

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

#!/bin/sh
ORIG_DIR=`pwd`
ARCHNAME=`echo $@ | sed 's/\.rar//g'`
mkdir -p $ARCHNAME
cd $ARCHNAME
unrar x $ORIG_DIR/$ARCHNAME.rar
find . -name "*.djvu" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.djvu";
find . -name "*.pdf" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.pdf";
find . -name "*.doc" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.doc";
cd $ORIG_DIR
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit »

sgfault писал(а):
31.10.2011 16:05
Ерунда, конечно, но все же: в чем смысл двух слешей в '${file//*.}' ? Ведь ваш pattern ('*.') в любом случае совпадет только один раз. Даже, более того, в чем смысл замены (pattern substitution), если фактически вы просто удаляете префикс (те в точности '${file##*.}') ? Или я просто неправильно понял ваш скрипт.. (запускать не пробовал)
Все правильно поняли. Я на автомате написал. Ваши замечания вполне справедливы.
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.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

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

Сообщение allez »

Ingvar16 писал(а):
05.11.2011 01:41
Вот добрые люди (sin) подкинули такое решение,но он у меня не работает.

Ну так поделитесь информацией о том, как именно вы этот скрипт запускаете и что он вам выдает на экран, а там, глядишь, и помощь придет. ;)
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

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

Сообщение Ingvar16 »

allez писал(а):
05.11.2011 14:22
Ingvar16 писал(а):
05.11.2011 01:41
Вот добрые люди (sin) подкинули такое решение,но он у меня не работает.

Ну так поделитесь информацией о том, как именно вы этот скрипт запускаете и что он вам выдает на экран, а там, глядишь, и помощь придет. ;)


Запускаю в директории с *.rar -файлами (/books-rar):
$ ./unrar.sh
и так в директории выше:
$ bash unrar.sh books-rar

где unrar.sh - вышеприведенный скрипт.

Выдаёт:

mkdir: пропущен операнд
и ещё:
./unrar.sh: 9: Syntax error: Unterminated quoted string
хотя ,вроде бы,все скобки на месте.

xargs: unmatched одинарная quote; by default quotes are special to xargs unless you use the -0 option

P.S. ОС: Debian Squeeze
$ bash --version
GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

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

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

allez писал(а):
05.11.2011 14:22
и что он вам выдает на экран
ругается на непарные кавычки, вестимо·

ага, я угадал (долго страница загружена была):
Ingvar16 писал(а):
05.11.2011 16:19
Unterminated quoted string


Ingvar16
Ingvar16 писал(а):
05.11.2011 16:19
Запускаю в директории с *.rar -файлами (/books-rar):
$ ./unrar.sh
unrar.sh — это файл с приведённым скриптом?
ему аргумент надо передать — имя файла в текущем каталоге, имеющее суффикс ".rar"

Ingvar16 писал(а):
05.11.2011 01:41
\"$ARCHNAME/{}.djvu"
и кавычку всё-таки забэкслэшить надо·
во всех трёх строках·
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
Ingvar16
Сообщения: 36
ОС: Debian Squeeze

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

Сообщение Ingvar16 »

sash-kan писал(а):
05.11.2011 16:39
unrar.sh — это файл с приведённым скриптом?
ему аргумент надо передать — имя файла в текущем каталоге, имеющее суффикс ".rar"

и кавычку всё-таки забэкслэшить надо·
во всех трёх строках·

Забэкслешил:

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

#!/bin/sh
ORIG_DIR=`pwd`
ARCHNAME=`echo $@ | sed 's/\.rar//g'`
mkdir -p $ARCHNAME
cd $ARCHNAME
unrar x $ORIG_DIR/$ARCHNAME.rar
find . -name "*.djvu" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.djvu\"
find . -name "*.pdf" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.pdf\"
find . -name "*.doc" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.doc\"
cd $ORIG_DIR


передаю имя файла в текущем каталоге c *.rar:

$ bash unrar.sh Ivanova.rar

Создаёт папку с именем архива,распаковывает туда архив,но внутри djvu не переименовывает в $ARCHNAME.

Кроме того,мне нужно распаковать и обработать все архивы в папке.

$ bash unrar.sh *.rar ничего не распаковывает (только создаёт пустые папки)
изменение скрипта,задачей обработки *.rar,тоже выдаёт что-то непонятное (его уносит на другие директории):

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

#!/bin/sh
for FILE_NAME in *.rar
 do
ORIG_DIR=`pwd`
ARCHNAME=`echo $@ | sed 's/\.rar//g'`
mkdir -p $ARCHNAME
cd $ARCHNAME
unrar x $ORIG_DIR/$ARCHNAME.rar
find . -name "*.djvu" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.djvu\"
find . -name "*.pdf" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.pdf\"
find . -name "*.doc" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.doc\"
cd $ORIG_DIR
done

Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

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

Сообщение sgfault »

Ingvar16 писал(а):
05.11.2011 18:14
Забэкслешил:

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

#!/bin/sh
ORIG_DIR=`pwd`
ARCHNAME=`echo $@ | sed 's/\.rar//g'`
mkdir -p $ARCHNAME
cd $ARCHNAME
unrar x $ORIG_DIR/$ARCHNAME.rar
find . -name "*.djvu" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.djvu\"
find . -name "*.pdf" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.pdf\"
find . -name "*.doc" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.doc\"
cd $ORIG_DIR


передаю имя файла в текущем каталоге c *.rar:

$ bash unrar.sh Ivanova.rar

Создаёт папку с именем архива,распаковывает туда архив,но внутри djvu не переименовывает в $ARCHNAME.

Этот скрипт.. написан, мягко говоря, странно.

Ошибки (или то, что может привести к весьма "интересным" последствиям):
1. Смысл $@ мне не понятен. Если вы используете $@, значит вы предполагаете наличие нескольких аргументов коммандной строки (те нескольких архивов)? Но что тогда, интересно, должно означать `cd $ARCHNAME` ? Вы пишите $@ без кавычек, но, если аргументы будут содержать символы из IFS (пробелы, например), то эта одна строка ($ARCHNAME) будет разделена на несколько аргументов при вызове `mkdir` (.. и тд). Те, если у вас файл называется 'a b.rar', то будут созданы директории 'a' и 'b', вместо 'a b'. И, наконец, использование $@ без кавычек или даже в `echo "$@"` просто бессмысленно, тк echo все равно все соединит в одну строку, разделенныую пробелами. Те, чтобы сделать обработку нескольких аргументов, вам нужно что-то типа

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

IFS='
'
ARCHNAME=`echo "$*" | ...`

Это будет работать для любых символов в именах файлов, кроме новой строки. Тем не менее, использование такой конструкции здесь все равно бессмысленно, если не менять остальной скрипт, который явно предполагает, что в ARCHNAME имя только одного архива.
2. Все переменные используются без кавычек. Это значит, что, если в имени директории или файлов оказываются, опять же, символы из IFS, то вы получаете больше, чем одно слово (word). Те совсем не то, что вам нужно.
3. Кавычки, передаваемые xargs-у, не нужны. Что вы хотите ими экранировать и от кого? `mv` запускает не shell, а сам xargs, те экранировать от shell-а смысла нет. А сам xargs, хоть и разделяет строку на аргументы по blank символами (видимо, это пробел и табуляция), но он это делает, во-первых, для входных данных (в данном случае, - это конвеер от find, и кавычки, соответственно, должны быть там), а, во-вторых, с опцией '-i' он этого вообще не делает (те в данном случае кавычки не нужны). В вашем же варианте, кавычки просто добавляются к имени файла при вызове mv (те получается вызов `mv "file" ...`, но файла "file" нету, есть только файл file (без кавычек в имени)).
4. Вызов mv в xargs, если предположить, что исходный файл он найдет, будет переименовывать вот так:

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

file.djvu -> "$ARCHNAME"/file.djvu.djvu     (но мы уже в "$ARCHNAME" !)

Те. он все равно не заработает, тк _папка_ назначения "$ARCHNAME" не существует. Не говоря уже про '.djvu.djvu'. Другими словами, в вызове `mv` написана глупость -)

Кое-что незначительное:
1. Смысл ORIG_DIR не понятен. Если вы используйте абсолютные пути, так используйте их везде. А, если относительные, то зачем вам понадобился ORIG_DIR ?
2. Для удаления '.rar' в случае одного аргумента нет смысла использовать sed - "${1%.rar}" должно работать в sh.
3. Говорят, опция xargs-а '-i' устарела, используйте '-I' (xargs(1)).
4. В конструкции вида

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

find . ... | xargs -IREPL  ... cmd some_path/REPL

аргумент команды cmd будет иметь вид

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

some_path/./some_find_result

тк find выводит полный путь относительно пути поиска (те точка в данном случае).
5. И, наконец, запуск _таких_ скриптов без опции оболочки '-e' может для вас закончиться чем-нибудь типа

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

rm -rf ~/Documents

в худшем случае. А еще лучше к '-e' добавить '-f'.

Другими словами, этот скрипт проще переписать, чем исправить -)

Ingvar16 писал(а):
05.11.2011 18:14
Кроме того,мне нужно распаковать и обработать все архивы в папке.

$ bash unrar.sh *.rar ничего не распаковывает (только создаёт пустые папки)
изменение скрипта,задачей обработки *.rar,тоже выдаёт что-то непонятное (его уносит на другие директории):

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

#!/bin/sh
for FILE_NAME in *.rar
 do
ORIG_DIR=`pwd`
ARCHNAME=`echo $@ | sed 's/\.rar//g'`
mkdir -p $ARCHNAME
cd $ARCHNAME
unrar x $ORIG_DIR/$ARCHNAME.rar
find . -name "*.djvu" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.djvu\"
find . -name "*.pdf" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.pdf\"
find . -name "*.doc" | xargs -i -t echo mv \"{}\" \"$ARCHNAME/{}.doc\"
cd $ORIG_DIR
done

А этот вариант.. Вы уж извините, но вы сами-то понимаете, что написали ?

Что же касается, как все это исправить.. Честно говоря, я так и не понял, что же должны делать вызовы `find | xargs` в вашем скрипте, но работающая распаковка выглядит примерно так:

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

#!/bin/sh -ef
IFS='
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"
mkdir -pv $ARCHNAME
echo "$ARCHNAME" | xargs -IREPL unrar x REPL.rar REPL

Чтобы распаковать все .rar файлы, запускайте так:

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

./unrar.sh *.rar
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4824
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit »

Вроде автору предложили уже достаточное количество вариантов решения его проблемы. А тут всплывают всё новые и всё более странные способы решения. Что-то я уже совсем потерял нить обсуждения...
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.
Спасибо сказали:
savik
Сообщения: 6
ОС: убунту 10.04

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

Сообщение savik »

Добрый день. Использую этот скрипт для извлечения архивов.

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

#!/bin/sh -ef
IFS='
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"
mkdir -pv $ARCHNAME
echo "$ARCHNAME" | xargs -IREPL unrar x REPL.rar REPL

Чтобы распаковать все .rar файлы, запускайте так:

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

./unrar.sh *.rar

Не устраивает одна вешь, он все извлечённые файлы раскладывает по папкам, мне это не надо. Пробовал переделать, не получилось.

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

#!/bin/sh -ef
IFS='
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"

echo "$ARCHNAME" | xargs -IREPL unrar x REPL.rar

Он извлекает только один файл и останавливается. Подскажите, что не так. Я не IT, я любитель самоучка.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21483
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

savik писал(а):
13.02.2012 12:21
Подскажите, что не так.

То, что тема называется распаковка zip архивов, каждый в свою папку. Чтобы просто распаковать файлы в текущий каталог, никакой скрипт не нужен. unrar *.rar
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
savik
Сообщения: 6
ОС: убунту 10.04

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

Сообщение savik »

Bizdelnick писал(а):
13.02.2012 13:01
savik писал(а):
13.02.2012 12:21
Подскажите, что не так.

То, что тема называется распаковка zip архивов, каждый в свою папку. Чтобы просто распаковать файлы в текущий каталог, никакой скрипт не нужен. unrar *.rar

300 архивов в папке , unrar *.rar. Не работает. Запускал из папки.
savik@savik-desktop:~/Загрузки$ unrar x *.rar
UNRAR 3.90 beta 2 freeware Copyright © 1993-2009 Alexander Roshal
Extracting from deer_family.part1.rar
Extracting from deer_family.part2.rar
No files to extract
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21483
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

Значит, привет от Рошаля...
Тогда так: for archive in *.rar ; do unrar "$archive" ; done
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
savik
Сообщения: 6
ОС: убунту 10.04

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

Сообщение savik »

Bizdelnick писал(а):
13.02.2012 13:34
Значит, привет от Рошаля...
Тогда так: for archive in *.rar ; do ; unrar $archive ; done

savik@savik-desktop:~/Загрузки$ for archive in *.rar ; do ; unrar $archive ; done
bash: ошибка синтаксиса около неожиданной лексемы `;'

Что в скрипте

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

xargs -IREPL
обозначает?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21483
Статус: nulla salus bello
ОС: Debian GNU/Linux

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

Сообщение Bizdelnick »

Лишнюю ; написал, извиняюсь. Исправил.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
savik
Сообщения: 6
ОС: убунту 10.04

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

Сообщение savik »

Bizdelnick писал(а):
13.02.2012 13:55
Лишнюю ; написал, извиняюсь. Исправил.

Спасибо но немного не так, после каждого файла надо у нажимать и ентер. Точно также работает этот скрипт

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

#!/bin/sh
ORIG_DIR=`pwd`
ARCHNAME=`echo $* | sed 's/\.rar//g'`
for ARCHNAME_INSTANCE in $ARCHNAME; do
unrar x $ARCHNAME_INSTANCE.rar
done

Хочется в одно касание, как в этом только без папок.

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

#!/bin/sh -ef  обьявляет как обрабатывать
IFS='                      это не знаю
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"   создаёт функцию как имя архива только .rar отрывает
mkdir -pv $ARCHNAME           создает папку с именем как у архива
echo "$ARCHNAME" | xargs -IREPL unrar x REPL.rar REPL  выводит имя архива без рар и дальше не знаю
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

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

Сообщение sgfault »

savik писал(а):
13.02.2012 14:05
Bizdelnick писал(а):
13.02.2012 13:55
Лишнюю ; написал, извиняюсь. Исправил.

Спасибо но немного не так, после каждого файла надо у нажимать и ентер. Точно также работает этот скрипт

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

#!/bin/sh
ORIG_DIR=`pwd`
ARCHNAME=`echo $* | sed 's/\.rar//g'`
for ARCHNAME_INSTANCE in $ARCHNAME; do
unrar x $ARCHNAME_INSTANCE.rar
done

Хочется в одно касание, как в этом только без папок.

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

#!/bin/sh -ef  обьявляет как обрабатывать
IFS='                      это не знаю
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"   создаёт функцию как имя архива только .rar отрывает
mkdir -pv $ARCHNAME           создает папку с именем как у архива
echo "$ARCHNAME" | xargs -IREPL unrar x REPL.rar REPL  выводит имя архива без рар и дальше не знаю


Между этими скриптами разница намного больше, чем может показаться на первый взгляд. В первом скрипте в нескольких местах пропущены кавычки, что приведет к непредсказуемому поведению в случае, если в именах файлов окажутся символы из IFS.

А такой вариант это не то, что вам надо?

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

#!/bin/sh -ef
IFS='
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"
mkdir -pv $ARCHNAME
echo "$ARCHNAME" | xargs -IREPL unrar x -o+ REPL.rar

(Обратите внимание, что файлы с одинаковыми именами из разных архивов будут перезаписаны без предупреждений)
Спасибо сказали:
savik
Сообщения: 6
ОС: убунту 10.04

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

Сообщение savik »

Немножко изменил, не перезаписует, спрашивает.

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

#!/bin/sh -ef
IFS='
'
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"
mkdir -pv $ARCHNAME
echo "$ARCHNAME" | xargs -IREPL unrar x -o- REPL.rar

спасибо! то что надо.
И всё равно интересно что нижняя строчка делает, в частности: xargs -IREPL
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

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

Сообщение sgfault »

savik писал(а):
13.02.2012 14:26
И всё равно интересно что нижняя строчка делает, в частности: xargs -IREPL

Исправил ваши комменты
savik писал(а):
13.02.2012 14:05

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

#!/bin/sh -ef  # Завершение при ошибках, отключить pathname expansion
IFS='
'                            # Только новая строка будет считаться разделителем во время Word Splitting фазы Expansion.
ARCHNAME="$(echo "$*" | sed 's/\.rar$//')"   # В данной переменной может быть _много_ имен папок (куда распаковывать архивы), разделенных новой строкой (IFS символ).
mkdir -pv $ARCHNAME                                # В общем случае, создает не папку, а папки_, если распаковывается несколько архивов за раз.
echo "$ARCHNAME" | xargs -IREPL unrar x REPL.rar REPL  # Выводит имена папок, разделенные новой строкой, и для каждого вызывает команду unrar x ИМЯ.rar ИМЯ


А, вообще, для вашего случая из этого скрипта можно выкинуть большую часть и получится так

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

#!/bin/sh -ef
IFS='
'
echo "$*" | xargs -d'\n' -L1 unrar x -o+


Upd.
savik писал(а):
13.02.2012 14:26
И всё равно интересно что нижняя строчка делает, в частности: xargs -IREPL

'REPL' в команде `unrar x REPL,rar REPL` будет заменен на "текущий аргумент" (строку из stdin), с которым xargs собирается запускать команду.
Спасибо сказали: