scripts/compression_utils/xzize.sh

163 lines
3.3 KiB
Bash
Executable File
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/sh
#
# xzize.sh, Copyright © 2010 Matteo Cypriani
#
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more details.
#
# This script recompresses to XZ (with maximum compression level) a
# GZip (.gz, .tgz), BZip2 (.bz2, .tbz, .tb2), LZMA (.lzma, .tlz), and
# Lempel-Ziv (.Z, .taz) compressed file. The original file is keeped.
# If the file extension does not correspond to a known compression
# format, the file is compressed to XZ. In that case, the original
# file is removed.
# If the file is already XZ compressed (.xz, .txz), nothing is done.
set -u
# Destination file suffix when source file name suffix is a
# 3-letter compressed tar suffix :
TAR_XZ_EXT=txz
test_extension()
{
local - FILE EXTENSION BASE
FILE="$1"
EXTENSION="$2"
NEWEXTENSION=xz
if [ $# -eq 3 ] ; then
NEWEXTENSION="$3"
fi
BASE="`basename "$FILE" ."$EXTENSION"`"
if [ "$BASE" != "$FILE" ] ; then
DEST="$BASE".$NEWEXTENSION
return 0
fi
DEST="$FILE"
return 1
}
do_recompress()
{
if [ -e "$DEST" ] ; then
echo "Skipping source file « $SOURCE »: destination file « $DEST » already exists!" >&2
return 0
fi
echo "Recompressing « $SOURCE » to « $DEST »…"
$ACTION -c "$SOURCE" | xz -9 >"$DEST"
return $?
}
## Verify number of arguments ##
if [ $# -lt 1 ] ; then
echo "$0 requires at least one argument!" >&2
exit 2
fi
## Process files ##
for SOURCE in "$@" ; do
# Does source file exist?
if [ ! -e "$SOURCE" ] ; then
echo "Skipping source file « $SOURCE »: does not exist!" >&2
continue
fi
# Does source file is regular?
if [ ! -f "$SOURCE" ] ; then
echo "Skipping source file « $SOURCE »: is not a regular file!" >&2
continue
fi
# GZip
if test_extension "$SOURCE" gz ; then
ACTION=gunzip
do_recompress
continue
fi
# GZipped Tar (.tgz)
if test_extension "$SOURCE" tgz $TAR_XZ_EXT ; then
ACTION=gunzip
do_recompress
continue
fi
# BZip2
if test_extension "$SOURCE" bz2 ; then
ACTION=bunzip2
do_recompress
continue
fi
# BZipped Tar (.tbz)
if test_extension "$SOURCE" tbz $TAR_XZ_EXT ; then
ACTION=bunzip2
do_recompress
continue
fi
# BZipped Tar (.tb2)
if test_extension "$SOURCE" tb2 $TAR_XZ_EXT ; then
ACTION=bunzip2
do_recompress
continue
fi
# LZMA
if test_extension "$SOURCE" lzma ; then
ACTION=unlzma
do_recompress
continue
fi
# LZMA compressed Tar (.tlz)
if test_extension "$SOURCE" tlz $TAR_XZ_EXT ; then
ACTION=unlzma
do_recompress
continue
fi
# Compress
if test_extension "$SOURCE" Z ; then
ACTION=uncompress
do_recompress
continue
fi
# Compressed Tar (.taz)
if test_extension "$SOURCE" taz $TAR_XZ_EXT ; then
ACTION=uncompress
do_recompress
continue
fi
# XZ
if test_extension "$SOURCE" xz ; then
echo "Skipping source file « $DEST »: has already .xz suffix!" >&2
continue
fi
# XZipped Tar (.txz)
if test_extension "$SOURCE" txz $TAR_XZ_EXT ; then
echo "Skipping source file « $DEST »: seems to be a XZipped Tar archive (.txz suffix)!" >&2
continue
fi
# Uncompressed file: fall back to simple compression
echo "Compressing « $SOURCE » to xz…"
xz -9 "$SOURCE"
done