backup备份文件时指定archive.exclude需要注意的问题

本文介绍在使用backup进行文件压缩时排除指定目录的方法及注意事项,特别是排除目录时不能以斜杠(/)结尾的要求。

        之前我写过一个关于backup如何备份数据的文章http://tiroc.iteye.com/blog/1048042

        今天主要记录一下,在压缩文档时指定排除一些目录和文件会遇到的问题。(目前只是我这里的情况,其他环境有待验证)

 

  archive :my_archive do |archive|  
    archive.add File.expand_path("./public/system/")
    #注意下边这个exclude方法的参数,videos是一个目录,但是一定不能以/结尾
    archive.exclude '/home/tiroc/code/test/public/system/videos'
    #而通过File.expand_path得到的路径,本身就不是以/结尾的
    archive.exclude File.expand_path("./public/system/captcha/")
  end 
 

为什么以/结尾的目录就无法exclude呢?backup的压缩文件部分调用了系统的tar。使用tar命令是如果想要排除一些文件可以这样:

 

tar -cf test.tar --exclude='test/dir1' 'test/'

这个命令可以将当前目录下的test目录压缩成test.tar,并且排除test/dir1目录。

 

        注意:在我的Ubuntu 10.10和10.04上发现被exclude的目录一定不能以/结尾,否则会无效。我不知道这个是系统的问题,还是tar命令本身就试着样的。还有,backup要用>=3.0.16的版本,之前的版本即使不以/结尾也不行

 

<think>我们在Linux下使用tar命令来压缩文件为.tar.gz格式。通常,这涉及到两个步骤:首先用tar打包文件,然后用gzip压缩。但是tar命令可以直接一步完成这两个操作。 具体命令是:`tar -zcvf 目标文件名.tar.gz 要压缩的文件或目录` 其中: -z: 使用gzip压缩或解压 -c: 创建新的归档文件 -v: 显示详细的压缩过程(可选,如果不想显示详细信息可以去掉) -f: 指定归档文件名 例如,如果我们要将目录`/home/user/data`压缩为`data_backup.tar.gz`,命令如下: tar -zcvf data_backup.tar.gz /home/user/data 如果只想压缩当前目录下的几个文件,比如file1.txt和file2.txt,可以这样: tar -zcvf myfiles.tar.gz file1.txt file2.txt 注意:如果目标文件名已经存在,它将被覆盖。另外,使用绝对路径压缩,解压也会解压到绝对路径,这可能会覆盖现有文件。通常建议在要压缩的目录的父目录中运行,并使用相对路径。 下面是一个简单的例子,假设当前目录下有一个名为`project`的目录,我们要将其压缩为`project.tar.gz`: tar -zcvf project.tar.gz project 解释: - `-z` 选项告诉tar使用gzip压缩。 - `-c` 表示创建归档。 - `-v` 表示显示过程(列出被压缩的文件)。 - `-f project.tar.gz` 指定压缩后的文件名为project.tar.gz。 - 最后一个参数`project`是要压缩的目录。 另外,如果我们要排除某些文件或目录,可以使用`--exclude`选项。例如,排除所有.log文件: tar -zcvf project.tar.gz --exclude='*.log' project 或者排除多个模式: tar -zcvf project.tar.gz --exclude='*.log' --exclude='*.tmp' project 当然,我们也可以使用通配符来压缩多个文件,比如: tar -zcvf archive.tar.gz *.txt # 压缩当前目录下所有txt文件 需要注意的是,如果压缩文件很大,我们可以使用`-I`选项来指定其他压缩程序(如pigz,一个并行压缩工具)以加快压缩速度。但通常gzip是默认的。 由于这是一个命令行操作,不需要写代码,但我们可以写一个简单的shell脚本示例,用于压缩指定目录,并记录日志。 下面是一个简单的shell脚本,它接受一个目录作为参数,然后将其压缩为.tar.gz文件,文件名包含当前日期间。 ```bash #!/bin/bash # 检查是否提供了参数 if [ $# -ne 1 ]; then echo "Usage: $0 <directory>" exit 1 fi # 获取目录名 DIR="$1" # 检查目录是否存在 if [ ! -d "$DIR" ]; then echo "Error: Directory $DIR does not exist." exit 1 fi # 生成带日期间戳的文件名 BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).tar.gz" # 执行压缩 echo "Compressing $DIR to $BACKUP_FILE ..." tar -zcvf "$BACKUP_FILE" "$DIR" # 检查是否成功 if [ $? -eq 0 ]; then echo "Compression completed successfully." else echo "Compression failed." fi ``` 将上述脚本保存为`compress_dir.sh`,然后赋予执行权限:`chmod +x compress_dir.sh`。运行方式:`./compress_dir.sh directory_to_compress`。 解释脚本: 1. 首先检查参数个数,如果不是1个,则输出用法并退出。 2. 检查提供的参数是否是一个存在的目录。 3. 生成备份文件名,格式为backup_年月日_分秒.tar.gz。 4. 使用tar命令压缩目录。 5. 检查tar命令的退出状态,如果为0则成功,否则失败。 注意:这个脚本会保留原目录结构,并且在当前目录下生成备份文件。 如果要在压缩排除某些文件,可以在tar命令中加入`--exclude`选项。例如,排除所有的临文件(*.tmp)和日志文件(*.log): tar -zcvf "$BACKUP_FILE" --exclude='*.tmp' --exclude='*.log' "$DIR" 但是注意,排除模式需要根据实际情况调整。 另外,如果目录很大,压缩可能需要一段间,并且我们可能希望看到进度。默认的`-v`选项会输出每个文件,但对于大量文件可能会很冗长。我们可以使用`-v`,或者去掉`-v`以静默模式运行。 以上就是在Linux下使用tar压缩为.tar.gz格式的方法。 §§相关问题§§: 1. 如何解压.tar.gz文件? 2. 如何压缩为.tar.bz2格式?它与.tar.gz有什么区别? 3. 如何只压缩目录中的某些特定文件(例如,所有.txt文件)? 4. 在压缩如何排除某些文件或目录?</think>在 Linux 下使用 `tar` 命令创建 `.tar.gz` 压缩文件(也称为 `tarball`)是常见的文件打包和压缩操作。下面是详细说明和示例代码: ### 基本命令格式 ```bash tar -czvf <输出文件名.tar.gz> <要压缩的文件/目录> ``` ### 参数解释: - `-c`:创建新的归档文件 - `-z`:使用 gzip 压缩 - `-v`:显示处理过程(可选,用于查看进度) - `-f`:指定输出文件名(必须放在最后) ### 示例代码 #### 示例 1:压缩单个目录 ```bash # 压缩当前目录下的 my_folder 目录 tar -czvf archive.tar.gz my_folder/ ``` #### 示例 2:压缩多个文件/目录 ```bash # 压缩 file1.txt, file2.log 和 another_folder tar -czvf backup.tar.gz file1.txt file2.log another_folder/ ``` #### 示例 3:压缩当前目录所有内容 ```bash # 压缩当前目录下所有文件和子目录 tar -czvf project_backup.tar.gz * ``` #### 示例 4:排除特定文件 ```bash # 压缩 logs 目录,但排除 .tmp 文件和 debug 子目录 tar -czvf logs.tar.gz \ --exclude='*.tmp' \ --exclude='logs/debug' \ logs/ ``` ### 高级用法:Shell 脚本 创建一个可重用的压缩脚本 `compress_dir.sh`: ```bash #!/bin/bash # 检查参数 if [ $# -lt 1 ]; then echo "用法: $0 <目录> [输出文件名]" exit 1 fi TARGET_DIR="$1" OUTPUT_FILE="${2:-${TARGET_DIR}_$(date +%Y%m%d).tar.gz}" # 验证目录存在 if [ ! -d "$TARGET_DIR" ]; then echo "错误: 目录 $TARGET_DIR 不存在" exit 1 fi # 执行压缩 echo "正在压缩 $TARGET_DIR 到 $OUTPUT_FILE..." tar -czf "$OUTPUT_FILE" "$TARGET_DIR" # 检查结果 if [ $? -eq 0 ]; then echo "压缩成功!" echo "文件大小: $(du -h $OUTPUT_FILE | cut -f1)" else echo "压缩失败" exit 1 fi ``` #### 脚本使用方式: ```bash # 赋予执行权限 chmod +x compress_dir.sh # 压缩目录(自动生成带日期的文件名) ./compress_dir.sh /path/to/directory # 指定输出文件名 ./compress_dir.sh /path/to/directory custom_name.tar.gz ``` ### 关键注意事项: 1. **路径问题**: - 使用相对路径(如 `my_dir`)会在压缩包内保留相对路径结构 - 使用绝对路径(如 `/home/user/docs`)会在解压还原完整路径 2. **权限要求**: - 需要对目标文件/目录有读取权限 - 需要对输出位置有写入权限 3. **排除文件技巧**: - 使用 `--exclude='pattern'` 排除特定文件 - 支持多个 `--exclude` 参数 - 支持从文件读取排除列表 `-X exclude-file.txt` 4. **压缩效率**: - 添加 `--use-compress-program=pigz` 可使用多线程 gzip 加速压缩 - 示例:`tar -cvf - dir/ | pigz > output.tar.gz` 5. **查看内容**: - 不解压查看内容:`tar -tf archive.tar.gz` - 查看详细信息:`tar -tvf archive.tar.gz` ### 解压对应命令 ```bash # 解压到当前目录 tar -xzvf archive.tar.gz # 解压到指定目录 tar -xzvf archive.tar.gz -C /target/directory ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值