#!/bin/bash
##################################################################
# file name: peekzip #
# see matched patterns in zip/jar/war or any zip compatible file #
##################################################################
ME=`basename $0`
showHelp()
{
echo "usage $ME -h"
echo "usage $ME [-i] [-c] [-n] [-d depth] text_pattern [suffix1] [...]"
echo "usage $ME [-i] [-c] [-n] [-d depth] -f zip_file text_pattern"
echo "-h: show help"
echo "-i: ingore case"
echo "-c: show command"
echo "-n: show line number"
echo "-d: search depth"
echo "-f: zip compatible file name"
echo "The file suffix is case insensitive"
}
DEFAULT_SUFFIX="zip jar war ear"
WORK_DIR=/tmp
TMP_FILE=$WORK_DIR/$ME.$$
INVALID=1
IGNORE_CASE=1
SHOW_COMMAND=1
NUMBER=1
FILE=1
DEPTH=1
# check arguments
while getopts :icnhf:d: OPTION
do
case $OPTION in
i) IGNORE_CASE=0
;;
c) SHOW_COMMAND=0
;;
n) NUMBER=0
;;
d) DEPTH=0
MAX_DEPTH=$OPTARG
;;
f) FILE=0
FILE_NAME=$OPTARG
;;
h) showHelp
exit 0
;;
*) INVALID=0
;;
esac
done
[ $INVALID -eq 0 ] && showHelp && exit 1
# assigned file name
[ $FILE -eq 0 ] && [ -z "$FILE_NAME" ] && showHelp && exit 1
shift `expr $OPTIND - 1`
PATTERN=$1
shift
SUFFIX=$*
[ -z "$PATTERN" ] && showHelp && exit 1
#echo "PATTERN=$PATTERN"
#echo "SUFFIX=$SUFFIX"
#echo "FILE_NAME=$FILE_NAME"
#echo "MAX_DEPTH=$MAX_DEPTH"
# set arguments
[ $IGNORE_CASE -eq 0 ] && IGNORE_CASE_ARG=" -i "
[ $NUMBER -eq 0 ] && NUMBER_ARG=" -n "
[ $DEPTH -eq 0 ] && MAX_DEPTH_ARG=" -maxdepth $MAX_DEPTH "
if [ $FILE -eq 0 ]
then
FILE_NAME_ARG=" -name /"$FILE_NAME/" "
else
# reset suffix if no suffix was specified
[ -z "$SUFFIX" ] && SUFFIX=$DEFAULT_SUFFIX
for VAR in $SUFFIX
do
S=$S"/|"$VAR
done
SUFFIX_PATTERN=`echo $S | sed 's///|//'`
FILE_NAME_ARG=" -iregex /".+/./($SUFFIX_PATTERN/)/" "
fi
FINDCMD="find . $MAX_DEPTH_ARG -type f $FILE_NAME_ARG 2>/dev/null $SUFFIX_ARG"
[ $SHOW_COMMAND -eq 0 ] && echo $FINDCMD
ZIP_FILES=`eval $FINDCMD`
for VAR in $ZIP_FILES
do
CMD="unzip -l $VAR 2>/dev/null | grep $IGNORE_CASE_ARG -E $PATTERN > $TMP_FILE"
[ $SHOW_COMMAND -eq 0 ] && echo $CMD
eval $CMD
[ ! -f $TMP_FILE ] && echo "Failed to create temp file $TMP_FILE!" && exit 1
WORD_COUNT=`wc -w $TMP_FILE | awk '{print$1}'`
if [ $WORD_COUNT -gt 0 ]
then
# got matched lines
echo -e "/033[;33;1m" # highlight the title line as bold yellow
echo "-------------------------------$VAR-------------------------------"
echo -e "/033[;0m/c" # rest font color
cat $NUMBER_ARG $TMP_FILE
/bin/rm -rf $TMP_FILE
fi
done
exit 0
peekzip
最新推荐文章于 2024-09-30 10:41:05 发布