Jak zmienić nazwę / wyodrębnić pliki o długich nazwach w archiwum zip

11

Mam zip, który zawiera pliki o bardzo długich nazwach.

Jeśli spróbuję wyodrębnić z wiersza polecenia, pojawia się błąd „Zbyt długa nazwa pliku”.
Jeśli użyję graficznego menedżera archiwum, nie wyodrębni on plików i nie pozwoli mi zmienić ich nazw. Ten sam problem występuje, jeśli podłączę archiwum.

Mogę wyodrębnić i zmienić nazwy plików indywidualnie, używając:

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

Jest to niepraktyczne z dużą ilością plików.

Czy istnieje narzędzie, które obcina nazwy plików podczas ich wyodrębniania?

Terence Eden
źródło
Jaka jest wydajność unzip -l <ARCHIVE>i jak chcesz obcinać nazwy? Czy chcesz zachować strukturę katalogów w archiwum podczas rozpakowywania?
David Foerster,

Odpowiedzi:

13

Wydobywać

Możemy wykorzystać zipinfojako część tego procesu, jest to program z zippakietu.

zipinfo -2 example.zip

pokaże tylko nazwy plików example.zip, coś wygląda jak:

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

dzięki czemu możemy użyć tej funkcji do wyodrębnienia wszystkich plików:

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%.*}: Usuwa rozszerzenie z długiej nazwy pliku, więc w przypadku gdy nazwa pliku jest mniejsza niż 256 znaków; Nie otrzymamy duplikatu rozszerzenia.
  • ${long_fname:0:250}.${i##*.}: Tworzy nową nazwę pliku z prawidłową liczbą znaków, dodaje także .rozszerzenie „a” pliku.

Po prostu zapętlamy listę plików i wypakowujemy każdy z nich nową, prawidłową nazwą pliku, która ma 256 znaków.


Aby zmienić nazwę

Możesz użyć zipnotepolecenia, to także część zippakietu.

Najpierw wykonaj kopię zapasową pliku zip.

Uruchom to polecenie:

zipnote example.zip > names

Otwórz nazwy za pomocą edytora, wygląda to tak:

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

Dodaj nowe nazwy plików w następujący sposób:

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

Następnie, aby zmienić nazwę plików, użyj:

zipnote -w example.zip < names

Zmieniłeś ich nazwy, możesz też napisać prosty skrypt, który zrobi to automatycznie.

Ravexina
źródło
Te są niezwykle przydatne, dzięki! Nie udało mi się uruchomić przykładu zipnote - a pierwszy usuwa rozszerzenie pliku - ale to wystarczy na to, co muszę zrobić. Dzięki!
Terence Eden
Zaktualizowałem odpowiedź, teraz zachowa również rozszerzenie;)
Ravexina
Powinieneś użyć tego, IFS= read -r ijeśli nazwy plików zaczynają się od spacji lub zawierają elementy, które powłoka może interpretować jako sekwencje specjalne.
David Foerster,