目的
为了备份源代码,但是整体打包太大,以后还原也麻烦,我需要将每个文件夹分开打包,所以需要一个脚本来完成这样的工作;
不得不说shell的执行存在些奇奇怪怪的问题,不要啰嗦了,上脚本!
使用说明
直接执行,会在所在目录生成一个tar-bz2-result的文件夹,这个是存放打包的目录;另外所在目录下的文件会单独打包到single-files.tar.bz2中;
脚本会在后台并行执行tar命令,请使用ps -ef | grep tar查看是否所有打包都完成了;
脚本源码
#!/bin/bash
#=================================================================================================
#lslh_line_cnt=$(($(ls -lh | awk '{print NR}' | tail -n1)-1))
#上面一行等价于下面的两行
lslh_line_cnt=$(ls -lh | grep -v 'tar-bz2.sh' | grep -v 'tar-bz2-result' | awk '{print NR}' | tail -n1)
lslh_line_cnt=$((lslh_line_cnt-1))
#=================================================================================================
#检查存在空格的文件名
all_files=$(ls -lh | grep -v 'tar-bz2.sh' | grep -v 'tar-bz2-result' | tail -n $lslh_line_cnt | awk '{for(i=1;i<=8;i++){$i="-"};print "\""$0"\""}')
all_files=$(echo $all_files|sed 's/"- - - - - - - - /"/g'|sed 's/" "/","/g')
# echo $all_files
file_name_check_ok=1
old_ifs=$IFS
IFS=","
for file in $all_files;do
# echo $file
result=$(echo $file|grep " ")
if [ "$result" != "" ];then
echo -e "\033[31;2m文件名有空格$file\033[0m"
file_name_check_ok=0
fi
done
IFS=$old_ifs
if [ $file_name_check_ok == 0 ];then
echo -e "\033[31m文件名检查失败!\033[0m"
exit 1
else
echo -e "\033[32;1m文件名检查通过!\033[0m"
fi
#=================================================================================================
files_cnt=$(ls -lh | grep -v 'tar-bz2.sh' | grep -v '^d' | awk '{print NR}' | tail -n1)
#需要去掉第一行和tar-bz2.sh文件本身
files_cnt=$((files_cnt-1))
files=$(ls -lh | grep -v 'tar-bz2.sh' | grep -v '^d' | tail -n $files_cnt | awk '{print "\""$9"\""}')
#需要tar-bz2-result文件夹本身
dirs_cnt=$(ls -lh | grep -v 'tar-bz2-result' | grep '^d' | awk '{print NR}' | tail -n1)
dirs=$(ls -lh | grep -v 'tar-bz2-result' | grep '^d' | awk '{print "\""$9"\""}')
echo "all files and dirs cnt = "$lslh_line_cnt
echo "all files cnt = "$files_cnt
echo "all dir cnt = "$dirs_cnt
echo "files:"
echo $files
echo "dirs: "
echo $dirs
#=================================================================================================
#判断存放打包的文件夹是否存在
if [ ! -d "tar-bz2-result" ];then
mkdir -p "tar-bz2-result"
echo "创建打包文件夹"
fi
#=================================================================================================
echo "打包根目录下单个文件"
#必须删除掉双引号,否则报错,我也不知道为什么,注意文件夹和文件名都不能有空格
files=$(echo $files | sed 's/"//g')
echo "tar -cjf tar-bz2-result/single-files.tar.bz2 $files"
tar -cjf tar-bz2-result/single-files.tar.bz2 $files &
echo "打包文件夹"
#必须删除掉双引号,否则报错,我也不知道为什么,注意文件夹和文件名都不能有空格
dirs=$(echo $dirs | sed 's/"//g')
for folder in $dirs;do
#echo $folder
echo "tar -cjf tar-bz2-result/$folder.tar.bz2 $folder/"
tar -cjf tar-bz2-result/$folder.tar.bz2 $folder/ &
done