1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/bin/bash
# -*- Mode:sh; Coding:us-ascii-unix; fill-column:158 -*-
################################################################################################################################################################
##
# @file      universalCat.sh
# @author    Mitch Richling <https://www.mitchr.me/>
# @brief     Like cat(1) but examines the file extension to determine if the file should be decompressed before being printed.@EOL
# @std       bash
# @copyright 
#  @parblock
#  Copyright (c) 1993,1994,1996,1998,2005,2011,2016 Mitchell Jay Richling <https://www.mitchr.me> All rights reserved.
#
#  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
#
#  1. Redistributions of source code must retain the above copyright notice, this list of conditions, and the following disclaimer.
#
#  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions, and the following disclaimer in the documentation
#     and/or other materials provided with the distribution.
#
#  3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without
#     specific prior written permission.
#
#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
#  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
#  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
#  SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
#  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#  @endparblock
# @filedetails
#
# The primary use case for this script is to simplify other scripts and command lines so that they may transparently work with files that may, or may not, be
# compressed.
#
# When I wrote the fist version of this script in the early 90's it was a simple if statement that switched between cat(1) and zcat(1), but it has grown over
# the years as I have encountered various compression formats.  As of the last update the following formats are supported:
#
#     - gunzip (.gz)   - bzcat (.bz & .bz2)    - 7z (.7z)       - lzcat (.lzma)    - xzcat (.xz)       
#     - zcat (.z)      - unzip (.zip)          - lzop (.lzo)    - lzip (.lz)       
#
################################################################################################################################################################

FILE="$1"

if [ -e "$FILE" ] ; then
  FILE_EXTENSION=`echo "$FILE" | sed 's/^.*\.//' | tr 'a-z' 'A-Z'`
  case "$FILE_EXTENSION" in
    GZ   ) gunzip  <    "$FILE";               ;;
    BZ   ) bzcat        "$FILE";               ;;
    BZ2  ) bzcat        "$FILE";               ;;
    Z    ) zcat         "$FILE";               ;;
    ZIP  ) unzip -p     "$FILE";               ;;
    XZ   ) xzcat        "$FILE";               ;;
    LZMA ) lzcat        "$FILE";               ;;
    7Z   ) 7z e -bd -so "$FILE" 2>/dev/null;   ;;
    LZO  ) lzop -Cfd <  "$FILE";               ;;
    LZ   ) lzip -d <    "$FILE";               ;;
    *    ) cat          "$FILE";               ;;
  esac
else
  echo "ERROR(universalCat): File missing: $FILE"
fi