Я пишу это с головы до головы, так что это непроверенный код, но он должен вывести вас на правильный путь. Он в основном идет по дереву, на которое вы указываете, в поисках файлов .rar. Найдя его, он распакует его на месте и удалит исходный архив, если unrar не вернет ненулевое значение. При попадании в папку, функция просто вызывает себя, вызывая ее рекурсивность.
#!/bin/bash
[[ ! -d "$1" ]] && echo "Please point me at a directory!" && exit 1
function recursively_extract_all_rars_in() {
local x=`pwd` f
cd "$1"
for f in (*); do
[[ -d "$f" ]] && recursively_extract_all_rars_in "$f"
[[ -f "$f" ]] && [[ "$f" =~ "*.rar" ]] && unrar e "$f" && rm ${f%%.*}.r??
done
cd "$x"
}
recursively_extract_all_rars_in "$1"
Имя функции полностью произвольно. Мне нравится, когда они читают как настоящий английский, когда приводятся их аргументы. [[ -d /path ]]
возвращает true, если путь существует и является каталогом. -f
делает соответствующие файлы. [[ "string" =~ "pattern"]]
- это bashism, который позволяет сопоставлять шаблоны в строках. Это работает в основном так же, как шаблоны глобуса.
Строка local x=pwd f
может быть загадочной, но она просто определяет две локальные переменные: одну с именем x, для хранения pwd
, и одну с именем f, неинициализированную (она инициализируется в цикле for ниже, я просто объявляю ее здесь, так что местный).
Хранение pwd
и возврат к нему, если ваша функция использует cd
- это хорошо (tm).
Обратите внимание, что использование вывода ls
программно - это, как правило, Bad Mojo, и вам следует избегать его, как вредителя, в пользу find
. Если какое-либо из ваших имен файлов содержит пробел, использование ls в вашем скрипте приведет к большим ошибкам. Вы были предупреждены.
ЗШ
Я не уверен, что вы можете сделать то же самое в Bash, но в ZSH я бы поместил следующее где-то в .zshrc
function recursive_unrar() {
for f in **/*.rar; do
local cwd=`pwd` fbn=${f##*/}
cd "${f%/*}"
unrar e "$fbn"
rm "${fbn%%.*}.r{01..99} $fbn"
cd "$cwd"
done
}
А затем просто позвоните изнутри соответствующей папки.