如何在zip存档中重命名/提取带有长名称的文件


11

我有一个包含非常长名称的文件的zip文件。

如果尝试在命令行上提取,则会出现错误“文件名太长”。
如果使用图形存档管理器,它将不会提取文件,也不会让我重命名它们。如果我装入归档文件,则会发生相同的问题。

我可以使用以下方法分别提取和重命名文件:

unzip -p -c example.zip "long file name.ogg" > shortname.ogg

这对于许多文件来说是不切实际的。

有没有一种工具在提取文件名时会截断它们?


输出的结果是unzip -l <ARCHIVE>什么?您想如何将名称截断?您是否要在提取过程中将目录结构保留在存档中?
David Foerster

Answers:


13

提取

我们可以将其zipinfo用作程序的一部分,它是程序zip包中的程序。

zipinfo -2 example.zip

只会显示中的文件名example.zip,如下所示:

file1-long-name-...-bla-bla.html
file2-long-name-...-bla-bla.html

因此我们可以使用此功能提取所有文件:

zipinfo -2 example.zip | while read i;
do
  long_fname=${i%.*}
  unzip -p -c example.zip "$i" > "${long_fname:0:250}.${i##*.}"
done;
  • long_fname=${i%.*}:从长文件名中删除扩展名,因此如果文件名少于256个字符;我们不会得到重复的扩展名。
  • ${long_fname:0:250}.${i##*.}:使用合法的字符数创建新的文件名,并添加.和文件的真实扩展名。

简而言之,我们进入文件列表并使用新的合法文件名256个字符提取每个文件。


重命名

您可以使用zipnote命令,它也是zip包的一部分。

首先获取您的zip文件的备份。

运行以下命令:

zipnote example.zip > names

使用编辑器打开名称,如下所示:

@ file name long in zip and a lot of other strings in the file name
@ (comment above this line)
@ (zip file comment below this line)

像这样添加新的文件名:

@ file name long in zip and a lot of other strings in the file name
@=new short name for above file
@ (comment above this line)
@ (zip file comment below this line)

然后使用以下命令重命名文件:

zipnote -w example.zip < names

您将它们全部重命名,还可以编写一个简单的脚本来自动为您执行此操作。


这些非常有用,谢谢!我无法使zipnote示例正常工作-第一个示例删除了文件扩展名-但这对于我需要做的事情已经足够了。谢谢!
特伦斯·伊甸园

我更新了答案,现在也会保留扩展名;)
Ravexina

如果IFS= read -r i文件名以空格开头或包含外壳程序可能会解释为转义序列的内容,则应使用。
大卫·佛斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.