Рекурсивно извлечь 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
Другие вопросы по тегам