main

rar2zip

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

Фичи:

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

  • Использует для своей работы системную временную директорию (обычно это /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-архивов... :-(