【问题标题】:How to exclude specific files with the tar command?如何使用 tar 命令排除特定文件?
【发布时间】:2016-05-28 02:44:11
【问题描述】:

假设我有以下目录结构

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 中的 every 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 吗?

【问题讨论】:

  • 您不能在创建存档时简单地将单个文件移到一边吗?
  • 否则,您可以使用find 的输出来提供tar 命令,您可以通过grep -v 过滤该输出,从而将模式锚定到命中的开头。
  • 错误的站点,不是编程问题。
  • @tink 我不这么认为。只需查看与tar 标签相关的所有类似问题。 @arkascha 谢谢,这条线可以完成工作:find ./dir/ | grep -v "\./dir/TODO.txt"。然而,将输出提供给tar 命令会给我带来奇怪的结果。我一直在挖掘。
  • @Backslash36 :仅仅因为某事反复发生并不能使它正确吗?

标签: linux tar


【解决方案1】:

不要使用 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

【讨论】:

    【解决方案2】:

    来自@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 的正则表达式中的 ^:它确保我们从文件层次结构的开头排除模式

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多