Рекурсивно извлечь RAR файлы
Я столкнулся с небольшой проблемой при рекурсивном извлечении rar-файлов. Я использую эту линию find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; && rm *.r*
и похоже на работу! Но проблема в том, что файлы, которые извлекаются, попадают в текущую рабочую папку. Когда я хочу, чтобы они были извлечены в папке, где они есть.
Это пример структуры файла, две папки, Holdiday_pictures_greece и Holdiday_pictures_malta. Они содержат RAR-файлы (или RAR-архивы). Holdiday_pictures_greece.rar и соответствующий архив Holdiday_pictures_greece.r01 Holdiday_pictures_greece.r02 и так далее.
~$ ls
Holdiday_pictures_greece
Holdiday_pictures_malta
~$ cd Holdiday_pictures_greece
Holdiday_pictures_greece $ ls
Holdiday_pictures_greece.rar
Holdiday_pictures_greece.r01
Holdiday_pictures_greece.r02
Holdiday_pictures_greece $ cd ..
~ $ find . -name '*.rar' -exec unrar e {} \; -exec rm {} \; && rm *.r*
~ $ ls
greece_01.jpg
greece_02.jpg
malta_01.jpg
malta_02.jpg
Как вы можете видеть из моего примера выше, все файлы из обоих архивов (Мальты и Греции) попадают в ~
каталог, где я запускал сценарий. Ожидаемым результатом будет то, что они окажутся в соответствующей папке Holdiday_pictures_malta и Holdiday_pictures_greece. В папках также могут быть подпапки. пример Holdiday_pictures_greece/2011
содержащий больше rar файлов.
Я пытался с -execdir, тот же результат, файлы заканчиваются в текущем каталоге.
Таким образом, ожидаемый результат будет состоять в том, чтобы перебрать все подпапки в текущем каталоге, извлечь файлы rar в папку, в которой они находятся, а затем удалить архив rar.
3 ответа
Это, вероятно, проще сделать с while
цикл вместо -exec
:
find . -type f -name -name '*.rar' -print0 |
while IFS= read -r -d '' file; do
dir=$(dirname "$file")
rar=$(basename "$file")
cd "$dir"
unrar -e "$rar" && rm "$rar"
cd -
done
Человек unrar:
НЕ БЕСПЛАТНЫЙ UNRAR СОВМЕСТИМОЙ ОПИСАНИЕ безрассудный [elvx] [-ep] [-o+] [-o-] [-ppassword] [-u] [-] АР-ЧИВ [ФАЙЛ...] [НАЗНАЧЕНИЕ]
This syntax should only be used in front-end programs which are using
non-free unrar as a back-end. It is recommended to use this program by
GNU command line syntax.
e Extract files from archive without full path.
l List files in archive.
v Verbose list files in archive.
x: Извлечь файлы из архива с полным путем.
будет извлекать.rar
в исходную папку, а не вpwd
cd FOLDER_WITH_RAR
find . -type f -name '*.rar' -print0 |
while IFS= read -r -d '' file; do
dir=$(dirname "$file")
rar=$(basename "$file")
cd "$dir"
echo "file=$file, dir=$dir, rar=$rar"
unrar x "$rar"
# rm -f "$rar"
cd -
done