如何仅从 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 {} . \;
我有一个 .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 {} . \;