log 目录打包 shell

日志打包的shell脚本, 可以添加到crontab中, 每天定时执行,将一天24时每小时的日志文件,合并打包到一个文件中, 并按照月份分组存放。

git:https://github.com/realgzq/logPatchShell


#!/bin/bash


# Help function
function HELP
{
echo "--------log4j log patch shell,coding by realgzq----------"
echo "The log file name must be ended with format yyyy-MM-dd-XX or yyyy-MM-dd.XX, 2015-08-08-16"
echo "arg1: the path of the log folder"
echo "arg2: the log file initial string, for example the log file name console.2016-04-12-00, this arg should be console."
echo "arg3: the days of patching file before today"
echo "Eg: /app/shell/tar_log.sh /log/tangren-server-web/ info_tangren-server.log. 2"
echo "if you want patch log file daily please config the /etc/crontab file like this:"
echo "13 0 * * * tangren /app/shell/tar_log.sh /log/tangren-erp-web/ console.log- 2"
exit 1
}


if test -z "$1" || test -z "$2" ||test -z "$3"
then
HELP
fi


day=$3
#echo ${day}
cmd=`printf "%s%s %s" "date -d\"" "${day}" "days ago\" +%Y-%m-%d"`
#echo "----------------------------------------------------------"
#echo $cmd
#echo "----------------------------------------------------------"
name=`eval $cmd`


#echo ${day}
cmd=`printf "%s%s %s" "date -d\"" "${day}" "days ago\" +%Y-%m"`
#echo "----------------------------------------------------------"
#echo $cmd
#echo "----------------------------------------------------------"
month_day_str=`eval $cmd`

#name=`date +%Y-%m-%d --date\\="${day} days ago"`
#name=`date -d'7 days ago' +%Y-%m-%d`
#echo $name
nametitle=$2
nameall=""

echo `date '+%Y-%m-%d %H:%M:%S'`" start patching"

cd $1

#if the patch folder not exist, creat it
if [ ! -d "bak/"$month_day_str ];
then
mkdir bak/$month_day_str
fi;


for((i=0;i<24;i++));
do
if [ $i -lt 10 ]
then
if [ -f $nametitle$name-0$i ]
then
nameall=`printf "%s %s" "$nameall" "$nametitle$name-0$i"`
fi;
if [ -f $nametitle$name.0$i ]
then
nameall=`printf "%s %s" "$nameall" "$nametitle$name.0$i"`
fi;
else
if [ -f $nametitle$name-$i ]
then
nameall=`printf "%s %s" "$nameall" "$nametitle$name-$i"`
fi;
if [ -f $nametitle$name.$i ]
then
nameall=`printf "%s %s" "$nameall" "$nametitle$name.$i"`
fi;
fi
done


echo "tar:$nameall => $nametitle$name.tar.gz"
echo "------------------------------------------"
tar zcf "bak/"$month_day_str"/"$nametitle$name.tar.gz $nameall
if [ -f "bak/"$month_day_str"/"$nametitle$name.tar.gz ]
then
echo "rm:$nameall"
rm -rf $nameall
fi;
sleep 1

echo '---'$name' patch finished ---'
echo `date '+%Y-%m-%d %H:%M:%S'`" patch finished!"
echo "------------------------------------------"


<think>我们正在讨论如何使用Shell命令将tar.gz文件进行打包(压缩)。用户的需求是查找使用shell指令进行tar.gz打包的方法。参考的引用内容中提到了解压.tar.gz文件的方法(使用tar -zxvf)以及批量解压的脚本,但用户现在需要的是打包(压缩)的方法。 在Shell中,打包并压缩为.tar.gz格式通常使用tar命令,结合选项来创建归档并压缩。常用的选项有: - `-c`: 创建新的归档文件 - `-z`: 通过gzip压缩归档(生成.tar.gz后缀) - `-v`: 显示详细过程(可选) - `-f`: 指定归档文件名(必须在其后紧跟文件名) 基本命令格式: tar -zcvf 目标文件名.tar.gz 要压缩的文件或目录 例如,将目录mydir压缩成mydir.tar.gz: tar -zcvf mydir.tar.gz mydir 如果需要压缩多个文件或目录,直接在后面列出: tar -zcvf archive.tar.gz file1.txt dir1 dir2 file2.jpg 注意:如果目标文件名已经存在,tar命令会覆盖它(除非设置了noclobber选项)。为了避免覆盖,可以在脚本中先检查文件是否存在。 另外,引用[2]提到一个问题:当使用通配符(如*.tar.gz)解压shell会将其展开,可能导致命令出错。同样,在打包使用通配符是安全的,因为tar命令会正确处理多个文件。 引用[3]展示了批量解压的脚本,我们可以类似地编写批量打包脚本。 如果需要批量打包多个目录(每个目录打包成一个单独的tar.gz文件),可以写一个循环: ```bash #!/bin/bash # 批量打包当前目录下的所有目录(每个目录单独打包) for dir in */; do tar -zcvf "${dir%/}.tar.gz" "$dir" done ``` 这个脚本会遍历当前目录下的每一个子目录(注意:模式`*/`匹配所有目录),然后对每个目录执行打包操作。`${dir%/}`是为了去掉目录名后面的斜杠(例如,将`dir1/`变成`dir1`),这样生成的压缩文件名为`dir1.tar.gz`。 如果是要将多个文件打包成一个压缩包,则可以直接列出这些文件,或者使用通配符。例如,将当前目录下所有.txt文件打包tar -zcvf text_files.tar.gz *.txt 但注意,如果文件数量非常多(例如上万个),使用通配符可能会超出命令行长度的限制。这可以使用find命令结合xargs,或者使用tar的`--files-from`选项从一个文件中读取列表。 例如,使用find将所有.txt文件打包: ```bash find . -name '*.txt' -print0 | tar -zcvf all_text_files.tar.gz --null -T - ``` 解释: - `find . -name '*.txt' -print0`: 查找当前目录及其子目录下所有.txt文件,并用空字符(null)分隔文件名(避免文件名中有空格等问题)。 - `|`:管道,将find的输出传递给tar。 - `tar -zcvf all_text_files.tar.gz --null -T -`:`--null`表示输入的文件名以空字符分隔;`-T -`表示从标准输入读取文件列表。 此外,引用[4]提到了如何将tar.gz打包shell脚本(即生成一个自解压的安装脚本)。这通常是通过在shell脚本的末尾追加tar.gz数据来实现的。用户运行脚本脚本可以提取自身末尾的压缩数据并解压。但用户当前的问题只要求普通的打包,所以我们可以暂不展开,但可以作为一个相关问题。 现在,我们按照用户要求,生成一个结构清晰的回答,包括基本命令、批量打包脚本以及注意事项。 </think>### 使用 Shell 指令进行 tar.gz 打包的方法 在 Shell 中创建 `.tar.gz` 压缩包是常见的文件归档操作,主要通过 `tar` 命令实现。以下是详细步骤和示例: #### 1. 基本打包命令 ```bash tar -zcvf 压缩包名称.tar.gz 文件或目录 ``` - **选项说明**: - `-z`:使用 gzip 压缩 - `-c`:创建新归档 - `-v`:显示详细过程(可选) - `-f`:指定归档文件名(必须放在最后) - **示例**: ```bash # 打包当前目录下所有文件 tar -zcvf archive.tar.gz ./* # 打包指定目录 tar -zcvf backup.tar.gz /path/to/directory ``` #### 2. 批量打包脚本 参考引用[3],可编写脚本批量处理多个目录: ```bash #!/bin/bash # 批量打包当前目录下所有文件夹 for dir in */; do tar -zcvf "${dir%/}.tar.gz" "$dir" done ``` - `${dir%/}` 去除目录名末尾的 `/` - 保存为 `pack_all.sh` 后执行 `chmod +x pack_all.sh && ./pack_all.sh` #### 3. 高级用法 - **排除特定文件**: ```bash tar -zcvf project.tar.gz --exclude='*.log' --exclude='tmp/*' project/ ``` - **仅打包修改间在 7 天内的文件**: ```bash find . -mtime -7 -type f | tar -zcvf recent_files.tar.gz -T - ``` - **创建自解压脚本**(参考引用[4]): ```bash cat > installer.sh << 'EOF' #!/bin/bash ARCHIVE_START=$(awk '/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0}' "$0") tail -n+$ARCHIVE_START "$0" | tar -zxvf - exit __ARCHIVE_BELOW__ EOF tar -zcvf data.tar.gz files_to_pack/ cat data.tar.gz >> installer.sh chmod +x installer.sh ``` #### 4. 注意事项 1. **顺序敏感**:`-f` 选项必须紧跟文件名 2. **通配符处理**:引用[2]指出 `*.tar.gz` 会被 Shell 展开,打包使用 `./*` 更安全 3. **压缩比**:添加 `--use-compress-program=pigz` 可使用多线程加速(需安装 `pigz`) 4. **权限保留**:添加 `-p` 选项保留文件权限(如 `tar -zcpvf`) > **验证压缩包**:使用 `tar -ztvf archive.tar.gz` 列出内容[^1] ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值