有 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
使用unzip
和grep
:
(注:这个答案参考了@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>
- 将文件提取到标准输出/屏幕。每个文件的名称在提取时都会打印出来。