155 lines
3.5 KiB
Plaintext
155 lines
3.5 KiB
Plaintext
|
#!/bin/bash
|
||
|
|
||
|
print_help() {
|
||
|
echo ""
|
||
|
echo "Convert an archive from one format to another"
|
||
|
echo ""
|
||
|
echo "Usage: to7zip [options] ...files"
|
||
|
echo ""
|
||
|
echo "Options:"
|
||
|
echo " -h, --help Print this help text"
|
||
|
echo " -d, --delete-old Delete converted file"
|
||
|
echo " -f, --force Replace the file with the converted file even if the file exists"
|
||
|
echo " -r, --rezip Extract and archive again even if the converted file is already a 7zip archive"
|
||
|
echo " -F, --format The format of the output"
|
||
|
echo " -t, --thread Set the number of threads for archive extraction and creation (default: $thread_count)"
|
||
|
echo ""
|
||
|
}
|
||
|
|
||
|
short_args=hdfrF:t:
|
||
|
long_args=help,delete-old,force,rezip,format:,thread:
|
||
|
|
||
|
# default
|
||
|
rezip=
|
||
|
delete_old=
|
||
|
force=
|
||
|
zip_args=
|
||
|
thread_count=8
|
||
|
params=""
|
||
|
|
||
|
# Parse arguments
|
||
|
parsed_args=$(getopt --options $short_args --longoptions $long_args --name "$0" -- "$@")
|
||
|
if [[ $? -ne 0 ]]; then
|
||
|
echo "Failed to parse arguments"
|
||
|
exit 2
|
||
|
fi
|
||
|
eval set -- "$parsed_args"
|
||
|
while true; do
|
||
|
case "$1" in
|
||
|
-h|--help)
|
||
|
print_help
|
||
|
exit 0
|
||
|
;;
|
||
|
-d|--delete-old)
|
||
|
delete_old=y
|
||
|
shift
|
||
|
;;
|
||
|
-f|--force)
|
||
|
force=y
|
||
|
shift
|
||
|
;;
|
||
|
-r|--rezip)
|
||
|
rezip=y
|
||
|
shift
|
||
|
;;
|
||
|
-F|--format)
|
||
|
case "$2" in
|
||
|
7z)
|
||
|
;;
|
||
|
zip)
|
||
|
zip_args="-tzip"
|
||
|
output_ext="zip"
|
||
|
;;
|
||
|
*)
|
||
|
echo "Unknown format: $2"
|
||
|
exit 1
|
||
|
esac
|
||
|
shift 2
|
||
|
;;
|
||
|
-t|--thread)
|
||
|
thread_count="$2"
|
||
|
shift 2
|
||
|
;;
|
||
|
--)
|
||
|
shift
|
||
|
break
|
||
|
;;
|
||
|
*)
|
||
|
break
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
out_dir="$PWD"
|
||
|
|
||
|
if [[ -z "$zip_args" ]]; then
|
||
|
zip_args="-t7z -m0=lzma2 -ms=on"
|
||
|
output_ext=7z
|
||
|
fi
|
||
|
|
||
|
for f in "$@"; do
|
||
|
tmp_dir="$(mktemp -d "$PWD/to7zip.XXX")"
|
||
|
output="$(echo "$f" | sed -E 's/\.(7z|tar\.gz|zip|rar)$//g').$output_ext"
|
||
|
backup_file="$output".backup
|
||
|
do_backup=
|
||
|
|
||
|
if [[ ! -r "$f" ]]; then
|
||
|
echo "$f : No such file or directory"
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
echo "$f -> $output"
|
||
|
|
||
|
if [[ -f "$output" ]]; then
|
||
|
if [[ -n "$force" ]] || [[ "$f" =~ .7z$ && -n "$rezip" ]]; then
|
||
|
do_backup=y
|
||
|
else
|
||
|
echo "$output : file exists, refusing to continue (-f to force)"
|
||
|
continue
|
||
|
fi
|
||
|
fi
|
||
|
|
||
|
if [[ "$f" =~ \.tar[^/]*$ ]]; then
|
||
|
if ! tar -xf "$f" -C "$tmp_dir" >/dev/null; then
|
||
|
echo "$f : extract failed"
|
||
|
continue
|
||
|
fi
|
||
|
elif [[ "$f" =~ \.tar|gz|bz2|zip|7z$ ]]; then
|
||
|
if ! 7z e -mmt="$thread_count" -o"$tmp_dir" "$f" >/dev/null; then
|
||
|
echo "$f : extract failed"
|
||
|
continue
|
||
|
fi
|
||
|
elif [[ "$f" =~ \.rar$ ]]; then
|
||
|
if ! unrar x "$f" "$tmp_dir" >/dev/null; then
|
||
|
echo "$f : unrar failed"
|
||
|
continue
|
||
|
fi
|
||
|
else
|
||
|
cp -r "$f" "$tmp_dir"
|
||
|
fi
|
||
|
|
||
|
if [[ -n "$do_backup" ]]; then
|
||
|
mv "$output" "$backup_file"
|
||
|
fi
|
||
|
|
||
|
pushd "$tmp_dir" >/dev/null
|
||
|
7z a $zip_args -mx=9 -mmt="$thread_count" "$out_dir/$output" >/dev/null
|
||
|
return_val=$?
|
||
|
popd >/dev/null
|
||
|
if [[ $return_val -eq 0 ]]; then
|
||
|
if [[ -n "$do_backup" ]]; then
|
||
|
rm -r "$backup_file"
|
||
|
elif [[ -n "$delete_old" ]]; then
|
||
|
rm -r "$f"
|
||
|
fi
|
||
|
else
|
||
|
if [[ -n "$do_backup" ]]; then
|
||
|
mv "$backup_file" "$output"
|
||
|
fi
|
||
|
echo "$f : 7z archive failed"
|
||
|
fi
|
||
|
|
||
|
rm -r "$tmp_dir"
|
||
|
done
|
||
|
|