diff options
-rwxr-xr-x | compress_large_files | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/compress_large_files b/compress_large_files new file mode 100755 index 0000000..e5c8a96 --- /dev/null +++ b/compress_large_files @@ -0,0 +1,57 @@ +#!/bin/bash +# +# Recursively compress any files greater than a supplied MINSIZE (-s), starting +# from the supplied DIRECTORY (-d). +# + +error() { + echo "Error: $1" + exit 1 +} + +usage() { + echo "Usage: $0 <options> + +Where <options> include: + -d DIRECTORY - Specify directory to recurse + -s MINSIZE - Minimum file size in MiB to compress + -n - Don't make changes, just display +" + exit 1 +} + +# Initialize variables +COMPRESS_SUFFIX=".gz" +COMPRESS_CMD="gzip -v --suffix ${COMPRESS_SUFFIX}" + +# Process cmdline arguments +DRYRUN=0 +MINSIZE="" +COMPRESS_DIR="" +while getopts "ns:d:h" options; do + case $options in + n ) DRYRUN=1 ;; + s ) MINSIZE=$OPTARG ;; + d ) COMPRESS_DIR=$OPTARG ;; + \?|h ) usage ;; + * ) usage ;; + esac +done + +# Validate input +test -z "${COMPRESS_DIR}" && error "Missing -d argument" +test -z "${MINSIZE}" && error "Missing -s argument" + +# Find files to compress using the supplied arguments +find "${COMPRESS_DIR}" -type f -not -name "*${COMPRESS_SUFFIX}" -size +"${MINSIZE}"M | +while read line +do + if [ ${DRYRUN} -eq 1 ]; then + echo "Would run: ${COMPRESS_CMD} ${line}" + else + ${COMPRESS_CMD} ${line} + # Create symlink to original file + ln -s $(basename $line).gz ${line} + fi +done + |