---
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-архивов... :-(