最近总是需要打包不同目录下的代码,之前都是find 之后 使用tar命令来打包,总是输入长串命令,觉得麻烦就想着写个脚本吧。
结果发现 find 命令在脚本中不能执行,后来询问朋友之后,原来是 *.h *号 没有被发挥通配符的作用 ! 必须把文件后缀 以变量的形式传入才行,下边是自己的代码!
#!/bin/bash
CUR_DIR=`pwd`
FILE_TYPE_H="h"
FILE_TYPE_C="c"
FILE_TYPE_CPP="cpp"
FILE_TYPE_CC="cc"
TMP_FILE="tmp.txt"
TARGET_FILE=$CUR_DIR"/Code.tar.gz"
if [ -f "$TARGET_FILE" ];then
`rm -rf $TARGET_FILE`
fi
echo "You will compress the codes in the { $CUR_DIR } direcotry "
echo "Are you sure { y or n }"
read AnsOne
if [ "$AnsOne" = "y" ] || [ "$AnsOne" = "yes" ]; then
echo "compress start >>>> and the dir is $CUR_DIR "
exec 3>$TMP_FILE
TMP_CMD="find $CUR_DIR -name *.$FILE_TYPE_H -o -name *.$FILE_TYPE_C -o -name *.$FILE_TYPE_CPP -o -name *.$FILE_TYPE_CC"
echo "excute shell cmd >>>>> $TMP_CMD"
RESULT=$(${TMP_CMD})
echo "$RESULT" >&3
exec 3>&-
echo "start compress code............."
TAR_CMD="tar -T $TMP_FILE -zcvf $TARGET_FILE"
${TAR_CMD}
echo "Compress code end .............leave file $TARGET_FILE"
`rm -rf $TMP_FILE`
elif [ "$AnsOne" = "n" ] || [ "$AnsOne" = "no" ]; then
echo "You choose n and please input the new path :"
exec 4>$TMP_FILE
read NEW_PATH
TMP_CMD="find $NEW_PATH -name *.$FILE_TYPE_H -o -name *.$FILE_TYPE_C -o -name *.$FILE_TYPE_CPP -o -name *.$FILE_TYPE_CC"
echo "excute shell cmd >>>>> $TMP_CMD"
RESULT=$(${TMP_CMD})
echo "$RESULT" >&4
exec 4>&-
echo "start compress code............."
TAR_CMD="tar -T $TMP_FILE -zcvf $TARGET_FILE"
${TAR_CMD}
echo "Compress code end .............leave file $TARGET_FILE"
`rm -rf $TMP_FILE`
else
echo "cant not figure your input "
fi
更新一个新的版本
#!/bin/bash
CUR_DIR=`pwd`
FIRST_PATH="first"
SECOND_PATH="second"
FILE_TYPE_H="h"
FILE_TYPE_C="c"
FILE_TYPE_CPP="cpp"
FILE_TYPE_CC="cc"
TMP_FILE="tmp.txt"
TMP_LOG="tmp.log"
DETACHED_BRANCH="HEAD detached"
TARGET_FILE_TMP=`sh -c 'git branch --no-color 2> /dev/null' | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/' -e 's/\//\_/g'`
if [[ $TARGET_FILE_TMP == *$DETACHED_BRANCH* ]];then
TARGET_FILE_BRANCH="Head_detached_branch"
else
TARGET_FILE_BRANCH=$TARGET_FILE_TMP
fi
FINAL_PATH=""
case $CUR_DIR in
*$FIRST_PATH*)
FINAL_PATH="_first_path"
;;
*$SECOND_PATH*)
FINAL_PATH="_second_path"
;;
esac
if [ -z "$TARGET_FILE_BRANCH" ];then
TARGET_FILE=$CUR_DIR"/Code.tar.gz"
else
TARGET_FILE=$CUR_DIR"/"$TARGET_FILE_BRANCH$FINAL_PATH"Code.tar.gz"
fi
if [ -f "$TARGET_FILE" ];then
`rm -rf $TARGET_FILE`
fi
if [ -f "$TMP_FILE" ];then
`rm -rf $TMP_FILE`
fi
if [ -f "$TMP_LOG" ];then
`rm -rf $TMP_LOG`
fi
echo "You will compress the codes in the { $CUR_DIR } direcotry "
echo "Are you sure { y or n }"
find_tar_action(){
echo "compress start >>>> and the dir is $1 "
exec 3>$TMP_FILE
TMP_CMD="find $1 -name *.$FILE_TYPE_H -o -name *.$FILE_TYPE_C -o -name *.$FILE_TYPE_CPP -o -name *.$FILE_TYPE_CC"
echo "excute shell cmd >>>>> $TMP_CMD"
RESULT=$(${TMP_CMD})
echo "$RESULT" >&3
exec 3>&-
`sed -e '/test/d' $TMP_FILE > $TMP_LOG`
echo "start compress code............."
TAR_CMD="tar -T $TMP_LOG -zcvphf $TARGET_FILE"
${TAR_CMD}
echo "Compress code end .............leave file $TARGET_FILE"
`rm -rf $TMP_FILE`
`rm -rf $TMP_LOG`
}
read AnsOne
if [ "$AnsOne" = "y" ] || [ "$AnsOne" = "yes" ]; then
find_tar_action "."
elif [ "$AnsOne" = "n" ] || [ "$AnsOne" = "no" ]; then
echo "You choose n and please input the new path :"
read NEW_PATH
find_tar_action $NEW_PATH
else
echo "cant not figure your input "
fi
之前的还是太复杂了,写个简单版本的,方便理解
#!/bin/bash
FILE_PATH=$1 ## input file path
find $FILE_PATH -type f -name "*" > $FILE_PATH"_all_files.txt"
if [ $? -ne 0 ]; then
echo "can not find files in $FILE_PATH"
fi
tar -T $FILE_PATH"_all_files.txt" -zcvf $FILE_PATH"_.tar.gz"
rm -rf $FILE_PATH"_all_files.txt"