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

How do I extract only the desired files from tar.gz?

我有一个 .tar.gz 文件,其中有多个文件夹。每个文件夹都有多个文件,我只想从它下面的所有文件夹中提取 SNAPSHOT.jar。

我试过使用通配符,但没有用。例如:

    tar -xf samplejars.tar.gz --wildcards "*SNAPSHOT*.jar"

samplejars.tar.gz 有很多文件夹,我只想提取 SNAPSHOT.jar。我该怎么做?

注意:所有罐子都有 unique/different 个名称。

我用以下文件夹结构对其进行了测试:

data/
data/a
data/a/ANOTHER_SNAPSHOT.jar
data/b
data/c
data/c/SNAPSHOT.jar
data/d
data/e
data/f
data/f/SNAPSHOT.jar.with.extension
data/g
data/g/SNAPSHOT.jar
data/h

以下通配符掩码有效并提取 完全匹配 SNAPSHOT.jar 而不是 SNAPSHOT.jar 的文件.extension 和 ANOTHER_SNAPSHOT.jar

tar -xf data.tar.gz --wildcards "*/SNAPSHOT.jar"

结果:

data/c/SNAPSHOT.jar
data/g/SNAPSHOT.jar

您可以使用您正在寻找的模式创建一个文件:

echo "*SNAPSHOT*.jar" > target

如果您有多个模式,您可以向目标文件添加多行

echo "*.md" >> target

然后你可以使用 --files-from 开关:

tar -xf samplejars.tar.gz --files-from=filename

我用

测试过
data/
data/a/
data/a/ANOTHER_SNAPSHOT.jar
data/b/
data/c/
data/c/SNAPSHOT.jar
data/d/
data/e/
data/f/
data/f/SNAPSHOT.jar.with.extension
data/g/
data/g/SNAPSHOT-2.jar
data/g/SNAPSHOT.jar
data/h/

结果

data/a/ANOTHER_SNAPSHOT.jar
data/c/SNAPSHOT.jar
data/g/SNAPSHOT-2.jar
data/g/SNAPSHOT.jar

如果所有文件都有唯一的文件名,如OP所说,您可以使用--strip-components删除文件结构

tar -xf samplejars.tar.gz --files-from=filename --strip-components 2

根据我的数据,结果是:

ANOTHER_SNAPSHOT.jar
SNAPSHOT.jar
SNAPSHOT-2.jar

因为我没有唯一的名称,SNAPSHOT.jar 文件之一在 --strip-components 步骤中被覆盖。

您可以为此使用 xargs :

tar -tf data.tar.gz | grep SNAPSHOT.jar | xargs tar -xf data.tar.gz 

然后,将所有文件移动到根目录

find archive_root_dir -type f -exec mv -i {} . \;