如何grep GZ文件来提取PNG文件?

如何grep GZ文件来提取PNG文件?,grep,png,gzip,Grep,Png,Gzip,好的,我在一个文件夹中有一个.GZ文件的音调,我希望递归地查看它们中的每一个,并将所有PNG文件提取到另一个目标文件夹中。我该怎么做 编辑: 我一直在终端上使用这个命令在GZ文件中找到一个字符串,并将整个文件复制到另一个目标目录。那就用它做点什么吧。有一些缺点。第一,当我输入“PNG”时,它会查找引用“PNG”而不是文件类型的CSS文件等文件。其次,除了复制整个文件外,它不会向目录输出任何内容。。我想解压这个文件 find . -type f -print0 | xargs -0 grep -l

好的,我在一个文件夹中有一个.GZ文件的音调,我希望递归地查看它们中的每一个,并将所有PNG文件提取到另一个目标文件夹中。我该怎么做

编辑:

我一直在终端上使用这个命令在GZ文件中找到一个字符串,并将整个文件复制到另一个目标目录。那就用它做点什么吧。有一些缺点。第一,当我输入“PNG”时,它会查找引用“PNG”而不是文件类型的CSS文件等文件。其次,除了复制整个文件外,它不会向目录输出任何内容。。我想解压这个文件

find . -type f -print0 | xargs -0 grep -lh "png" | xargs -I % cp % /some_destination
编辑:

下面是一个文件夹结构示例:

FILE001.GZ、FILE002.GZ、FILE003.GZ等

并非所有文件都包含PNG,其中一些文件在文件夹结构中包含许多文件。我想要的是另一个目标文件夹中的以下内容:

34950560.png、3959560.png等


提前谢谢你

您可以使用文件签名(又名幻数)。PNG文件的前几个字节包含一个文件签名,表示该文件是PNG文件。如果文件都是gzip,那么gzip中还有一个额外的头,我们可以跳过它
od是一个命令,它将以您指定的可读格式转储文件的一部分。我告诉它跳过gzip头并以十六进制格式转储。根据我的测试,接下来的八个字节将以字符串“34e6 5580”结束。如果它与PNG签名匹配,请将其移动到新目录并重命名

COUNTER=0; mkdir PNGDIR
#
for FILE in `ls -1d *`; do  
   od -j 4 -N 10 -x ${FILE} | grep -q "34e6 5580" 
   if [ $? -eq 0 ]; then
     COUNTER=`expr 1 + $COUNTER`
     cp ${FILE} PNGDIR/picture_${COUNTER}.png.gz
   fi
done

您可以使用文件签名(又名魔术数字)。PNG文件的前几个字节包含一个文件签名,表示该文件是PNG文件。如果文件都是gzip,那么gzip中还有一个额外的头,我们可以跳过它
od是一个命令,它将以您指定的可读格式转储文件的一部分。我告诉它跳过gzip头并以十六进制格式转储。根据我的测试,接下来的八个字节将以字符串“34e6 5580”结束。如果它与PNG签名匹配,请将其移动到新目录并重命名

COUNTER=0; mkdir PNGDIR
#
for FILE in `ls -1d *`; do  
   od -j 4 -N 10 -x ${FILE} | grep -q "34e6 5580" 
   if [ $? -eq 0 ]; then
     COUNTER=`expr 1 + $COUNTER`
     cp ${FILE} PNGDIR/picture_${COUNTER}.png.gz
   fi
done

您可以使用文件签名(又名魔术数字)。PNG文件的前几个字节包含一个文件签名,表示该文件是PNG文件。如果文件都是gzip,那么gzip中还有一个额外的头,我们可以跳过它
od是一个命令,它将以您指定的可读格式转储文件的一部分。我告诉它跳过gzip头并以十六进制格式转储。根据我的测试,接下来的八个字节将以字符串“34e6 5580”结束。如果它与PNG签名匹配,请将其移动到新目录并重命名

COUNTER=0; mkdir PNGDIR
#
for FILE in `ls -1d *`; do  
   od -j 4 -N 10 -x ${FILE} | grep -q "34e6 5580" 
   if [ $? -eq 0 ]; then
     COUNTER=`expr 1 + $COUNTER`
     cp ${FILE} PNGDIR/picture_${COUNTER}.png.gz
   fi
done

您可以使用文件签名(又名魔术数字)。PNG文件的前几个字节包含一个文件签名,表示该文件是PNG文件。如果文件都是gzip,那么gzip中还有一个额外的头,我们可以跳过它
od是一个命令,它将以您指定的可读格式转储文件的一部分。我告诉它跳过gzip头并以十六进制格式转储。根据我的测试,接下来的八个字节将以字符串“34e6 5580”结束。如果它与PNG签名匹配,请将其移动到新目录并重命名

COUNTER=0; mkdir PNGDIR
#
for FILE in `ls -1d *`; do  
   od -j 4 -N 10 -x ${FILE} | grep -q "34e6 5580" 
   if [ $? -eq 0 ]; then
     COUNTER=`expr 1 + $COUNTER`
     cp ${FILE} PNGDIR/picture_${COUNTER}.png.gz
   fi
done
假设您的“.GZ”文件实际上是包含多个文件的gzip“.tar”归档文件,那么您可以在一行中完成您的目标:

find . -type f -iname '*.GZ' | xargs -n1 -I'{}' tar -C "/path/to/extract" -xf '{}' '*.png' 2>/dev/null
说明:

  • find-键入f-iname'*.GZ'
    :查找当前路径(包括子目录)中的所有.GZ文件
    -iname
    表示不区分大小写,匹配.gz和.gz文件
  • xargs-n1-I'{}'{}'
    :从stdin调用最多一个参数(
    -n1
    )的'command',将参数放置在占位符
    {}
  • tar-C”/path/to/extract“-xf'{}'*.png'
    :从xargs(
    -xf{}
    )获取的文件中提取,仅提取以'*.png'结尾的文件<代码>-C/path/to/extract:在那里提取文件
  • 2>/dev/null
    :禁用从不包含.png文件的GZ文件引发的错误消息
此命令将提取指定文件夹中的所有
.png
文件(保留原始tar.gz文件中的任何目录结构)。跨多个存档的同名
.png
文件将只存储一次,即最后提取的
.png
文件将覆盖以前同名的文件。 如果要解决此问题,则需要更复杂的脚本,如:

#!/usr/bin/bash

function extract_png() {
    local gzpath=$1; local extract_path=$2
    cd "$gzpath" || return 2
    find . -iname '*.GZ' | 
        while read gzfile; do
            if tar -tf "$gzfile" '*.png' 2>/dev/null; then
                local basename=${gzfile%.*}; basename=${basename##*/}
                local extract_to="$extract_path/$basename"
                mkdir -p "${extract_to}"
                tar -C "$extract_to" -xf "$gzfile" '*.png'
            fi
        done
}

extract_png '/path/to/search' '/path/to/save'
extract\u png
功能将提取的
.png
文件保存到每个归档文件的不同子文件夹中,位于
/path/to/save
下(例如
/path/to/save/FILE001/
/path/to/save/FILE002/
等)

关于
if tar-tf“$gzfile”*.png”2>/dev/null的说明;然后…
:如果文件“$gzfile”中有.png文件,则返回true。tar中的
-t
参数表示“列表内容”。当指定的文件(
*.png
)未包含在存档中时,
tar-t
打印一条错误消息(由
2>/dev/null
隐藏),并返回一个非零代码,该代码将此条件评估为false。

假设您的.GZ文件实际上是gzip压缩的.tar存档,包含多个文件,然后,您可以在一行中完成您的目标:

find . -type f -iname '*.GZ' | xargs -n1 -I'{}' tar -C "/path/to/extract" -xf '{}' '*.png' 2>/dev/null
说明:

  • find-键入f-iname'*.GZ'
    :查找当前路径(包括子目录)中的所有.GZ文件
    -iname
    表示不区分大小写,匹配.gz和.gz文件
  • xargs-n1-I'{}'{}'
    :从stdin调用最多一个参数(
    -n1
    )的'command',将参数放置在占位符
    {}
  • tar-C”/path/to/extract“-xf'{}'*.png'
    :从xargs(
    -xf{}
    )获取的文件中提取,仅提取以'*.png'结尾的文件<代码>-C/path/to/extract:在那里提取文件
  • 2>/dev/null
    :禁用从不包含