#!/bin/sh # # xzize.sh, Copyright © 2010, 2019 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 one or several GZip (.gz, .tgz), BZip2 (.bz2, # .tbz, .tb2), LZMA (.lzma, .tlz), or Lempel-Ziv (.Z, .taz) compressed file(s). # The original files are kept. # # If a file extension does not correspond to a known compression format, that # 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 -x set -u # Destination file suffix when source file name suffix is a # 3-letter compressed tar suffix: readonly TAR_XZ_EXT=txz # Default compression level: COMPRESSION_LEVEL= test_extension() { FILE="$1" EXTENSION="$2" NEWEXTENSION=xz if [ $# -eq 3 ] ; then NEWEXTENSION="$3" fi BASE="$(echo "$FILE" | sed "s/\.${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 $COMPRESSION_LEVEL >"$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 # Is source file 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 $COMPRESSION_LEVEL "$SOURCE" done # vim: tabstop=8 expandtab shiftwidth=4 softtabstop=4