繁体   English   中英

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

[英]How to exclude specific files with the tar command?

假设我有以下目录结构

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 吗?

来自@arkascha 的回答:

find dir/ -type f | grep -v "^dir/TODO.txt" > files.txt

然后

tar -czf dir.tar.gz -T files.txt

从第一行开始,有2个技巧需要注意:

  1. -type f选项 如果没有放置,目录将包含在find的结果中。 这很糟糕,因为它会在文件层次结构中包含每个文件的深度。
  2. grep正则表达式中的^ :它确保我们从文件层次结构的开头排除模式

不要使用dir/来命名您的传输,而是将 cd 放入dir ,然后将其命名为. . 文件夹名称. 以后永远不会出现在任何文件路径中,因此它可以作为一个强大的锚点。 然后使用--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 进入dir ,将其命名为.

$ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM