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

3
我有一个.tar.gz文件,其中有多个文件夹。每个文件夹下有多个文件,我只想从其中所有文件夹中提取SNAPSHOT.jar文件。
我尝试使用通配符,但没有帮助。例如:
    tar -xf samplejars.tar.gz --wildcards "*SNAPSHOT*.jar"

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

注意:所有的jar文件都有唯一/不同的名称。


PS:用户“ford”的答案完美地回答了我的问题。 - Dhiraj
3个回答

3

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

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.with.extension”和“ANOTHER_SNAPSHOT.jar”。
tar -xf data.tar.gz --wildcards "*/SNAPSHOT.jar"

结果:

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

谢谢Florian,这在一定程度上有所帮助。 但是,是否可能仅获取tar.gz中的jar文件而不是文件夹? 例如,您的答案示例输出在data/c/和data/g/文件夹下有两个SNAPSHOT.jars。我该如何只获取.jar文件而不是文件夹? - Dhiraj
2
从理论上讲这是可能的,有一些方法已在以下问题中讨论:https://dev59.com/MGYq5IYBdhLWcg3wrSas问题在于,你正在寻找具有相同名称的多个jar文件,因此它们无法提取到同一个文件夹中。 - Florian Schlag
谢谢Florian。你分享的链接给我提供了所需的东西。 - Dhiraj

0
你可以使用xargs来实现这个功能:
tar -tf data.tar.gz | grep SNAPSHOT.jar | xargs tar -xf data.tar.gz 

接下来,将所有文件移动到根目录

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

谢谢@blue112,这在一定程度上有所帮助。 但是,是否可能仅从tar.gz中获取jar文件而不是文件夹? 我的意思是,您分享的命令会从tar.gz中提取文件夹结构。我们能否仅从tar.gz中获取jar文件,而没有文件夹结构? - Dhiraj
@Dhiraj,如果有两个同名的存储罐,你会如何处理? - blue112
哦,我忘了提到 :) 这些jar包有唯一的名称,所以不是问题。 - Dhiraj

0
你可以使用你所寻找的模式来创建一个文件:
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 步骤中被覆盖。


谢谢@Dan Meigs,这在一定程度上有所帮助。 但是,是否可能只获取tar.gz中的jar文件而不是文件夹? 例如,您的答案中的示例输出将两个SNAPSHOT.jars放在data/c/和data/g/等文件夹下。我该如何只获取.jar文件而不是文件夹? - Dhiraj
1
我根据@Florian Schlag提供的链接更新了我的答案。 - Dan Meigs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接