从 zip 存档的每个成员中读取前 N 行

从 zip 存档的每个成员中读取前 N 行

有 10 个文件,它们被压缩到 Ten.zip 中。如何从压缩文件中的所有 10 个文件中读取前 n 行(比如 2 行)?有什么简单的命令吗?

答案1

没有“简单”命令,因为 unzip 本身不提供此功能。您必须要求它提取部分或全部文件并自行处理。这是另一种方法:

zipinfo -1 Ten.zip | while IFS= read -r filename
do 
  unzip -p Ten.zip "$filename" | sed 2q
done

此处的区别在于用于zipinfo列出存档的内容,每行一个;然后我们逐行读取这些文件名,并要求unzip将该文件提取到屏幕上(以便-p文件名是不是打印),然后通过管道sed将其打印(默认情况下),在第 2 行退出。

如果您归档的文件名称中包含换行符,则此操作有可能失败;不过,您不会这样做,因为解压缩会在提取时破坏文件名:

$ touch file$'\n'name
$ zip foo.zip file*name
$ rm file*name
$ zipinfo -1 foo.zip
file^Jname
$ unzip foo.zip
Archive:  foo.zip
 extracting: filename
$ ls -lrt
...
filename

答案2

使用unzipgrep

(注:这个答案参考了@RomanPerekhrest的答案和这里有一个帖子

bash-3.2$ unzip -l ten.zip
Archive:  ten.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        6  02-07-2018 09:16   0.txt
        6  02-07-2018 09:16   1.txt
        6  02-07-2018 09:16   2.txt
        6  02-07-2018 09:16   3.txt
        6  02-07-2018 09:16   4.txt
        6  02-07-2018 09:16   5.txt
        6  02-07-2018 09:16   6.txt
        6  02-07-2018 09:16   7.txt
        6  02-07-2018 09:16   8.txt
        6  02-07-2018 09:16   9.txt
---------                     -------
       60                     10 files
bash-3.2$

将压缩文件的内容提取到 stdout/screen:

bash-3.2$ unzip -c ten.zip | grep -A2 extracting
 extracting: 0.txt
0
0
--
 extracting: 1.txt
1
1
--
 extracting: 2.txt
2
2
--
 extracting: 3.txt
3
3
And so on..

命令: unzip -c ten.zip | grep -A[n] extracting。这里的“n”可以是用户想要查看的行数。

答案3

unzip+awk解决方案:

示例10xml.zip档案结构:

$ unzip -l 10xml.zip 
Archive:  10xml.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       20  2018-02-07 11:20   home/osboxes/temp_files/1.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/2.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/3.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/4.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/5.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/6.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/7.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/8.xml
       20  2018-02-07 11:20   home/osboxes/temp_files/9.xml
       21  2018-02-07 11:20   home/osboxes/temp_files/10.xml
---------                     -------
      201                     10 files

  • unzip -l <archive>- 列出存档文件(短格式)

从存档中的每个文件中提取前 2 行:

unzip -c 10xml.zip | awk -v n=2 'NR==1{ next }/^ +inflating:/{ n=NR+2; next }n && NR<=n'
  • unzip -c <archive>- 将文件提取到标准输出/屏幕。每个文件的名称在提取时都会打印出来。

相关内容