--- title: rar2zip tags: shell, linux, repost --- > программист - это такой вид идиота, который потратит час на пятиминутную работу, чтобы потом её за секунду сделал компьютер. Фичи: ---- * Запароленные архивы пропускаются * Даты модификации файлов в внутри архивов - сохраняются как есть. * Работает полностью автоматически, если невозможно создать файл в исходной директории - матерится и переходит к следующему архиву. * Выдает лог работы * Понимает как относительные, так и абсолютные пути * Использует для своей работы системную временную директорию (обычно это /tmp), берегитесь переполнения. Ограничения: --- #!/bin/bash LOGFILE=$(mktemp) if [ -z "$1" ]; then echo "usage: $0 " 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-архивов... :-(