命令无法使用时该怎么办?

37

当我执行 unzip -l zip文件名 时,我看到:

1295627  08-22-11 07:10   A.pdf
473980  08-22-11 07:10   B.pdf
...

我只想看到文件名。我尝试了这个

unzip -l zipFilename | cut -f4 -d" "

但我认为分隔符不仅仅是" "


如果空格数量固定,您必须相应地推进字段,例如 -f7。如果文件名的位置固定,请改用 -b - Kerrek SB
4个回答

105

最简单的方法是使用以下命令:

unzip -Z -1 archive.zip
或者
zipinfo -1 archive.zip

这将只列出文件名,每行一个。

这两个命令完全等效。 -Z 选项告诉 unzip 将其余的选项视为 zipinfo 选项。有关 unzip 和 zipinfo 的详细信息,请参阅unzipzipinfo的手册页面。


28

假设文件名中没有空格:

unzip -l filename.zip | awk '{print $NF}'

我的解压输出包含头部和尾部,所以 awk 脚本如下:

unzip -l filename.zip | awk '/-----/ {p = ++p % 2; next} p {print $NF}'

处理文件名中含有空格的版本:

unzip -l filename.zip | awk '
    /----/ {p = ++p % 2; next}
    $NF == "Name" {pos = index($0,"Name")}
    p {print substr($0,pos)}
'

2
你能否解释一下你的 awk 脚本呢?如果你没有时间也完全理解。 - Thang Pham
4
Awk有一个每行用的NF变量,它表示字段数量。$NF是最后一个字段的值,因此这就是如何获取文件名的。第二个脚本通过在出现带有"-----"的第一行时将变量p设置为true,只有当p为true时才执行{printf $NF}块。 - glenn jackman
6
您可以使用 -qq 选项来去除文件头和尾部:unzip -l -qq filename.zip。然后更简单的 awk 语句就能发挥作用了。 - amicitas

6

如果你需要处理带有空格的文件名,可以尝试使用以下方法:

unzip -l zipfilename.zip | awk -v f=4  ' /-----/ {p = ++p % 2; next} p { for (i=f; i<=NF;i++) printf("%s%s", $i,(i==NF) ? "\n" : OFS) }'

3

使用awk:

unzip -l zipfilename | awk '{print $4}'

但是,要注意包含空格的恶意文件名。 - nos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接