linux - 如何使用 tar 命令排除特定文件?

标签 linux tar

假设我有以下目录结构

dir/
├── subdir
│   ├── dir
│   │   └── TODO.txt
│   └── TODO.txt
└── TODO.txt

我希望在 Linux 上使用 tar 命令将 dir/ 递归地打包到 tarball 中,但是我想排除根 TODO.txt。我如何用相对路径指定它?

尝试#1

tar -czf dir.tar.gz  dir/ --exclude='TODO.txt'

不起作用:它摆脱了生成的 tarball 中的每个 TODO.txt:

dir/
└── subdir
    └── dir

尝试 #2

tar -czf dir.tar.gz  dir/ --exclude='dir/TODO.txt'

这也失败了,因为 dir 子目录也与此模式匹配。因此生成的 tarball 包含

dir/
└── subdir
    ├── dir
    └── TODO.txt

有什么方法可以准确指定我想用相对路径排除根 TODO.txt 吗?

最佳答案

不要使用 dir/ 来命名您的传输,而是进入 dir,然后将其命名为 .。文件夹名称 . 将永远不会出现在任何文件路径中,因此它可以作为一个强大的 anchor 。然后使用 --transform=,使存档中的路径以 dir/ 开头。

示范

没有过滤器:

$ tar -czf dir.tar.gz -v dir
dir/
dir/TODO.txt
dir/subdir/
dir/subdir/TODO.txt
dir/subdir/dir/
dir/subdir/dir/TODO.txt

cd 进入目录,将其命名为:

$ tar -czf dir.tar.gz -v -C dir .
./
./TODO.txt
./subdir/
./subdir/TODO.txt
./subdir/dir/
./subdir/dir/TODO.txt

排除,锚定在上。:

$ tar -czf dir.tar.gz -v -C dir --exclude='./TODO.txt' .
./
./subdir/
./subdir/TODO.txt
./subdir/dir/
./subdir/dir/TODO.txt

. 更改回存档内的 dir(--show-transformed-names 使 tar 显示名称,因为它们进入归档):

$ tar -czf dir.tar.gz -v -C dir --exclude='./TODO.txt' --transform='s/^\./dir/g' --show-transformed-names .
dir/
dir/subdir/
dir/subdir/TODO.txt
dir/subdir/dir/
dir/subdir/dir/TODO.txt

关于linux - 如何使用 tar 命令排除特定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35439028/

相关文章:

gzip - 检查 tar gz 文件的总内容大小

php - tar ssh 无法正常工作

node.js tar 模块, 'entry' 可读流

linux - 如何通过 shell 脚本发送带有投票按钮的电子邮件?

linux - Node JS - 监听系统事件

.net - 使用 .Net Core 运行 .Net Framework 应用程序(在 Linux 上)

linux - 如何从 tar.gz 中仅提取所需的文件?

linux - 如何在不解压缩的情况下查找 tar 文件中文件的行数

c++ - iptables C++ 控制

linux - 通过 SSH 的 rsync 仅保留 www-data 拥有的文件的所有权