tar文件夹独立压缩批量压缩脚本

本文介绍了一款Shell脚本,用于将当前目录下的文件及文件夹分别进行压缩打包,并放置于专门的文件夹内。该脚本可以有效解决整体打包过大及还原困难的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目的

为了备份源代码,但是整体打包太大,以后还原也麻烦,我需要将每个文件夹分开打包,所以需要一个脚本来完成这样的工作;

不得不说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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值