tar打包过滤指定目录指南

在 Linux 中使用 tar 命令打包时,有多种方法可以过滤和排除指定的目录或文件。以下是各种排除方法的详细说明。

1. 基础排除方法

1.1 使用 --exclude 参数(单次排除)

bash 复制代码
# 排除单个目录
tar -czvf backup.tar.gz --exclude='node_modules' /path/to/directory

# 排除多个目录
tar -czvf backup.tar.gz --exclude='node_modules' --exclude='.git' --exclude='tmp' /path/to/directory

1.2 使用 --exclude 参数(模式匹配)

bash 复制代码
# 使用通配符排除所有匹配的目录
tar -czvf backup.tar.gz --exclude='*/node_modules' --exclude='*.log' /path/to/directory

# 排除所有隐藏目录和文件
tar -czvf backup.tar.gz --exclude='.*' /path/to/directory

2. 使用排除文件列表

2.1 创建排除文件

创建一个文本文件(如 exclude-list.txt),列出所有要排除的目录和文件:

bash 复制代码
# 创建排除文件
cat > exclude-list.txt << EOF
node_modules
.git
*.log
tmp/
build/
dist/
.cache
.DS_Store
*.tmp
EOF

2.2 使用排除文件打包

bash 复制代码
# 使用排除文件
tar -czvf backup.tar.gz --exclude-from=exclude-list.txt /path/to/directory

# 或者使用长格式
tar -czvf backup.tar.gz -X exclude-list.txt /path/to/directory

3. 高级排除技巧

3.1 相对路径与绝对路径排除

bash 复制代码
# 相对当前目录排除(推荐)
cd /path/to/directory
tar -czvf ../backup.tar.gz --exclude='node_modules' --exclude='.git' .

# 使用绝对路径排除
tar -czvf backup.tar.gz --exclude='/path/to/directory/node_modules' /path/to/directory

3.2 排除特定文件类型

bash 复制代码
# 排除特定扩展名的文件
tar -czvf backup.tar.gz --exclude='*.log' --exclude='*.tmp' --exclude='*.swp' /path/to/directory

# 排除备份文件
tar -czvf backup.tar.gz --exclude='*~' --exclude='*.bak' /path/to/directory

3.3 使用 find 配合 tar 进行复杂过滤

bash 复制代码
# 使用 find 查找文件并传递给 tar(排除 node_modules 和 .git)
find /path/to/directory -name '*' -type f ! -path '*/node_modules/*' ! -path '*/.git/*' -print0 | tar -czvf backup.tar.gz --null -T -

4. 实际应用示例

4.1 备份网站目录(排除缓存和日志)

bash 复制代码
#!/bin/bash
BACKUP_FILE="website-backup-$(date +%Y%m%d).tar.gz"
EXCLUDE_FILE="/home/backup/exclude-list.txt"

# 创建排除列表
cat > $EXCLUDE_FILE << EOF
cache/
logs/
*.log
tmp/
uploads/temp_*
.env
.git
node_modules
EOF

# 执行备份
tar -czvf $BACKUP_FILE -X $EXCLUDE_FILE /var/www/html

4.2 备份用户数据(排除系统文件)

bash 复制代码
# 备份 home 目录,排除常见不需要备份的目录
tar -czvf home-backup.tar.gz \
    --exclude='*/Downloads' \
    --exclude='*/.cache' \
    --exclude='*/.local/share/Trash' \
    --exclude='*/.npm' \
    --exclude='*/.docker' \
    /home/username

4.3 项目代码备份

bash 复制代码
#!/bin/bash
PROJECT_DIR="/home/projects/myapp"
BACKUP_NAME="myapp-code-$(date +%Y%m%d).tar.gz"

tar -czvf $BACKUP_NAME \
    -C $PROJECT_DIR \
    --exclude='node_modules' \
    --exclude='dist' \
    --exclude='build' \
    --exclude='.git' \
    --exclude='*.log' \
    --exclude='.env' \
    --exclude='.DS_Store' \
    .

5. 验证和查看排除效果

5.1 先测试排除效果(不实际打包)

bash 复制代码
# 只列出将要被打包的文件,验证排除效果
tar -czvf /dev/null --exclude='node_modules' --exclude='.git' /path/to/directory 2>&1 | head -20

# 或者使用 tar -t 来测试
tar -czf test.tar.gz --exclude='node_modules' /path/to/directory
tar -tf test.tar.gz | head -20
rm test.tar.gz

5.2 查看打包内容

bash 复制代码
# 查看打包文件内容,确认排除成功
tar -tzvf backup.tar.gz | less

6. 排除模式参考表

排除模式 说明 示例
目录名/ 排除指定目录 --exclude='node_modules/'
*/.git 排除所有 .git 目录 --exclude='*/.git'
*.ext 排除特定扩展名文件 --exclude='*.log'
.* 排除所有隐藏文件 --exclude='.*'
目录/*.tmp 排除目录下特定文件 --exclude='tmp/*.tmp'

7. 常见注意事项

7.1 引号使用

bash 复制代码
# 当排除模式包含通配符时,使用引号
tar -czvf backup.tar.gz --exclude='*/node_modules' /path

# 如果不使用引号,shell可能会先展开通配符
tar -czvf backup.tar.gz --exclude=*/node_modules /path  # 可能不会按预期工作

7.2 路径匹配规则

bash 复制代码
# 这些规则是等价的
tar -czvf backup.tar.gz --exclude='node_modules' /path
tar -czvf backup.tar.gz --exclude='/path/node_modules' /path
tar -czvf backup.tar.gz --exclude='path/node_modules' /path

# 但使用相对路径更安全
cd /path && tar -czvf backup.tar.gz --exclude='node_modules' .

7.3 排除符号链接

bash 复制代码
# 默认情况下,tar 会跟随符号链接,要排除符号链接可以:
tar -czvf backup.tar.gz --exclude='symlink_name' /path

# 或者使用 -h 选项不跟随符号链接
tar -czvhf backup.tar.gz --exclude='node_modules' /path

8. 实用脚本示例

8.1 智能备份脚本

bash 复制代码
#!/bin/bash
# smart-backup.sh

BACKUP_DIR=$1
BACKUP_NAME=$(basename $BACKUP_DIR)-$(date +%Y%m%d-%H%M%S).tar.gz
EXCLUDE_LIST=(
    "node_modules"
    ".git"
    "*.log"
    "tmp"
    "build"
    "dist"
    ".cache"
    "*.tmp"
)

# 构建排除参数
EXCLUDE_PARAMS=""
for pattern in "${EXCLUDE_LIST[@]}"; do
    EXCLUDE_PARAMS+=" --exclude='$pattern'"
done

# 执行备份
echo "Backing up $BACKUP_DIR to $BACKUP_NAME"
eval "tar -czvf $BACKUP_NAME $EXCLUDE_PARAMS $BACKUP_DIR"

echo "Backup completed: $BACKUP_NAME"

使用方式:

bash 复制代码
chmod +x smart-backup.sh
./smart-backup.sh /path/to/your/project

通过掌握这些 tar 排除技巧,你可以更精确地控制打包内容,避免不必要的数据包含在备份或分发包中,从而节省存储空间和传输时间。

相关推荐
jimy15 小时前
安卓里运行Linux
linux·运维·服务器
爱凤的小光6 小时前
Linux清理磁盘技巧---个人笔记
linux·运维
耗同学一米八7 小时前
2026年河北省职业院校技能大赛中职组“网络建设与运维”赛项答案解析 1.系统安装
linux·服务器·centos
知星小度S8 小时前
系统核心解析:深入文件系统底层机制——Ext系列探秘:从磁盘结构到挂载链接的全链路解析
linux
2401_890443028 小时前
Linux 基础IO
linux·c语言
智慧地球(AI·Earth)9 小时前
在Linux上使用Claude Code 并使用本地VS Code SSH远程访问的完整指南
linux·ssh·ai编程
老王熬夜敲代码10 小时前
解决IP不够用的问题
linux·网络·笔记
zly350010 小时前
linux查看正在运行的nginx的当前工作目录(webroot)
linux·运维·nginx
QT 小鲜肉10 小时前
【Linux命令大全】001.文件管理之file命令(实操篇)
linux·运维·前端·网络·chrome·笔记
问道飞鱼11 小时前
【Linux知识】Linux 虚拟机磁盘扩缩容操作指南(按文件系统分类)
linux·运维·服务器·磁盘扩缩容