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

Ter*_*den 12 filename zip unzip

我有一个 zip,其中包含名称很长的文件。

如果我尝试在命令行上提取,则会收到错误“文件名太长”。
如果我使用图形存档管理器,它不会提取文件,也不会让我重命名它们。如果我挂载存档,也会出现同样的问题。

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

unzip -p -c example.zip "long file name.ogg" > shortname.ogg
Run Code Online (Sandbox Code Playgroud)

这对于大量文件是不切实际的。

是否有工具可以在提取文件名时截断文件名?

Rav*_*ina 15

提取

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

zipinfo -2 example.zip
Run Code Online (Sandbox Code Playgroud)

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

file1-long-name-...-bla-bla.html
file2-long-name-...-bla-bla.html
Run Code Online (Sandbox Code Playgroud)

所以我们可以使用这个特性来提取所有文件:

zipinfo -2 example.zip | while read i;
do
  long_fname=${i%.*}
  unzip -p -c example.zip "$i" > "${long_fname:0:250}.${i##*.}"
done;
Run Code Online (Sandbox Code Playgroud)
  • long_fname=${i%.*}: 去除长文件名的扩展名,以防文件名小于256个字符;我们不会得到重复的扩展名。
  • ${long_fname:0:250}.${i##*.}: 创建一个具有合法字符数的新文件名,并添加一个.文件真实扩展名。

我们只是循环到文件列表中,并使用一个新的合法文件名(256 个字符)提取每个文件。


重命名

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

首先备份您的 zip 文件。

运行此命令:

zipnote example.zip > names
Run Code Online (Sandbox Code Playgroud)

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

@ 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)
Run Code Online (Sandbox Code Playgroud)

添加新文件名,如下所示:

@ 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)
Run Code Online (Sandbox Code Playgroud)

然后重命名文件使用:

zipnote -w example.zip < names
Run Code Online (Sandbox Code Playgroud)

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

  • 当长度为 250 时,我仍然遇到错误。我只是将其降低到 100,一切正常。 (2认同)