7

I have a zip which contains files with very long names.

If I try to extract on the command line, I get the error "File name too long".
If I use the graphical archive manager it will not extract the files and it will not let me rename them. The same problem occurs if I mount the archive.

I can extract and rename files individually using:

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

This is impractical with lots of files.

Is there a tool which will truncate filenames as they are extracted?

  • What's the output of unzip -l <ARCHIVE> and how do you want the names truncated? Do you want to retain the directory structure inside the archive during extraction? – David Foerster May 19 '17 at 11:04
8

To extract

We can use zipinfo as a part of this process, it's a program from zip package.

zipinfo -2 example.zip

will only shows the files names in example.zip, something look like:

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

so we can use this feature to extract all files:

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%.*}: Removes extension from long file name, so in case of file name being less that of 256 character; We're not going to get a duplicate extension.
  • ${long_fname:0:250}.${i##*.}: Creates a new file name with legitimate number of character also adds a . and file real extension.

Simply we are looping into files list and extract each of them with a new legitimate file name which is 256 character.


To rename

You can use zipnote command, it's a part of zip package too.

Get a backup of your zip file first.

Run this command:

zipnote example.zip > names

Open names using an editor, it's look like this:

@ 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)

Add new file names like this:

@ 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)

Then to rename files use:

zipnote -w example.zip < names

You renamed them all, you can also write a simple script which do this automatically for you.

  • Those are incredibly useful, thanks! I couldn't get the zipnote example to work - and the first one removes the file extension - but that's good enough for what I need to do. Thanks! – Terence Eden May 14 '17 at 11:05
  • I updated the answer, now it will keep the extension too ;) – Ravexina May 14 '17 at 11:24
  • You should use IFS= read -r i in case the file names start with white space or contain things that the shell may interpret as escape sequences. – David Foerster May 19 '17 at 11:05

protected by Community Jun 5 '17 at 0:50

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.