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

时间:2019-05-17 14:14:05

标签: linux tar

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

我尝试使用通配符,但无济于事。例如:

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

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

注意:所有的罐子都有唯一的/不同的名称。

3 个答案:

答案 0 :(得分:3)

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

reprex %>%
    group_by(id, number) %>%
    mutate(check = setequal(sort(unique(classification)), 
                              sort(unique(`classification-1`))))

以下通配符掩码起作用并仅提取 SNAPSHOT.jar 完全匹配而不是SNAPSHOT.jar.with.extension和ANOTHER_SNAPSHOT.jar

的文件
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

结果:

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

答案 1 :(得分: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

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

答案 2 :(得分: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 {} . \;