You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.5 KiB
75 lines
2.5 KiB
9 years ago
|
---
|
||
|
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-архивов... :-(
|