---
title: rar2zip
tags: shell, linux, repost
---

> программист - это такой вид идиота, который потратит час на пятиминутную работу, чтобы потом её за секунду сделал компьютер.

Фичи:
----

  * Запароленные архивы пропускаются
  * Даты модификации файлов в внутри архивов - сохраняются как есть.
  * Работает полностью автоматически, если невозможно создать файл в исходной директории - матерится и переходит к следующему архиву.
  * Выдает лог работы
  * Понимает как относительные, так и абсолютные пути

  * Использует для своей работы системную временную директорию (обычно это /tmp), берегитесь переполнения.
Ограничения:

---

    #!/bin/bash
    
    LOGFILE=$(mktemp)
    
    if [ -z "$1" ]; then
      echo "usage: $0 <dir>"
      exit 1
    fi
    
    find "$1" -name *.rar | while read FILE
    do
      if [ ! -w "$FILE" ]; then
        echo "can't write to file, skipped: $FILE"
        continue
      fi
    
      # path to file must be absolute, non relative
      if [ "${FILE:0:1}" != "/" ]; then
        FILE="$(pwd)/$FILE"
      fi
    
      unrar t -p- "$FILE" 1> /dev/null 2> /dev/null
      if [ "$?" -ne 0 ]; then
        echo "Password-protected file, please, repack manually: $FILE" | \
        tee "$LOGFILE"
        continue
      fi
    
      OWNER=$(stat -c "%u" "$FILE")
      GROUP=$(stat -c "%g" "$FILE")
      FMODE=$(stat -c "%a" "$FILE")
      TDIR=$(mktemp -d)
      NFILE=$(basename "$FILE" .rar)
      NFILE="${NFILE}.zip"
      DEST=$(dirname "$FILE")
    
      pushd "$TDIR" > /dev/null
      unrar x -ts -ow -idq "$FILE" && \
      zip --latest-time --quiet --recurse-paths "$NFILE" *
    
      chown "$OWNER:$GROUP" "$NFILE" && chmod "$FMODE" "$NFILE" && \
      mv -i "$NFILE" "$DEST/" && rm "$FILE" && echo "Repacked: $FILE"
      popd > /dev/null
    
      rm -rf "$TDIR"
    #  exit 0
    done
    
    echo "See logfile for possible errors: $LOGFILE"
    
    # vim: set syntax=sh ts=2 noet

Единственная проблема: У меня больше не осталось rar-архивов... :-(