Come rinominare / estrarre i file con nomi lunghi nell'archivio zip


11

Ho una zip che contiene file con nomi molto lunghi.

Se provo ad estrarre dalla riga di comando, viene visualizzato l'errore "Nome file troppo lungo".
Se uso il gestore dell'archivio grafico non estrarrà i file e non mi permetterà di rinominarli. Lo stesso problema si verifica se monto l'archivio.

Posso estrarre e rinominare i file individualmente usando:

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

Questo non è pratico con molti file.

Esiste uno strumento che tronca i nomi dei file man mano che vengono estratti?


Qual è l'output di unzip -l <ARCHIVE>e come si desidera che i nomi vengano troncati? Vuoi mantenere la struttura delle directory all'interno dell'archivio durante l'estrazione?
David Foerster,

Risposte:


13

Estrarre

Possiamo usare zipinfocome parte di questo processo, è un programma dal zippacchetto.

zipinfo -2 example.zip

mostrerà solo i nomi dei file example.zip, qualcosa del tipo:

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

così possiamo usare questa funzione per estrarre tutti i file:

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%.*}: Rimuove l'estensione dal nome file lungo, quindi nel caso in cui il nome file sia inferiore a 256 caratteri; Non avremo un'estensione duplicata.
  • ${long_fname:0:250}.${i##*.}: Crea un nuovo nome di file con un numero legittimo di caratteri e aggiunge .un'estensione reale del file.

Stiamo semplicemente eseguendo il looping nell'elenco dei file ed estraiamo ciascuno di essi con un nuovo nome di file legittimo di 256 caratteri.


Rinominare

Puoi usare il zipnotecomando, fa anche parte del zippacchetto.

Ottieni prima un backup del tuo file zip.

Esegui questo comando:

zipnote example.zip > names

Apri nomi usando un editor, è simile al seguente:

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

Aggiungi nuovi nomi di file come questo:

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

Quindi per rinominare i file utilizzare:

zipnote -w example.zip < names

Li hai rinominati tutti, puoi anche scrivere un semplice script che lo fa automaticamente per te.


Sono incredibilmente utili, grazie! Non sono riuscito a far funzionare l'esempio zipnote - e il primo rimuove l'estensione del file - ma è abbastanza buono per quello che devo fare. Grazie!
Terence Eden,

Ho aggiornato la risposta, ora manterrà anche l'estensione;)
Ravexina,

Dovresti usare IFS= read -r inel caso in cui i nomi dei file inizino con uno spazio bianco o contengano elementi che la shell può interpretare come sequenze di escape.
David Foerster,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.