Cara mengganti nama / mengekstrak file dengan nama panjang di arsip zip

11

Saya memiliki zip yang berisi file dengan nama yang sangat panjang.

Jika saya mencoba mengekstrak pada baris perintah, saya mendapatkan kesalahan "Nama file terlalu panjang".
Jika saya menggunakan manajer arsip grafis itu tidak akan mengekstrak file dan tidak akan membiarkan saya mengganti nama mereka. Masalah yang sama terjadi jika saya memasang arsip.

Saya dapat mengekstraksi dan mengganti nama file secara individual menggunakan:

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

Ini tidak praktis dengan banyak file.

Apakah ada alat yang akan memotong nama file saat mereka diekstraksi?

Terence Eden
sumber
Apa hasil dari unzip -l <ARCHIVE>dan bagaimana Anda ingin nama-nama terpotong? Apakah Anda ingin mempertahankan struktur direktori di dalam arsip selama ekstraksi?
David Foerster

Jawaban:

13

Untuk mengekstrak

Kita dapat menggunakan zipinfosebagai bagian dari proses ini, ini adalah program dari zippaket.

zipinfo -2 example.zip

hanya akan menampilkan nama file example.zip, sesuatu yang terlihat seperti:

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

jadi kami dapat menggunakan fitur ini untuk mengekstrak semua 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%.*}: Menghapus ekstensi dari nama file yang panjang, jadi jika nama file kurang dari 256 karakter; Kami tidak akan mendapatkan ekstensi duplikat.
  • ${long_fname:0:250}.${i##*.}: Membuat nama file baru dengan jumlah karakter yang sah juga menambahkan .dan mengajukan ekstensi nyata.

Cukup kita beralih ke daftar file dan mengekstrak masing-masing dengan nama file yang sah baru yaitu 256 karakter.


Untuk mengganti nama

Anda dapat menggunakan zipnoteperintah, itu adalah bagian dari zippaket juga.

Dapatkan cadangan file zip Anda terlebih dahulu.

Jalankan perintah ini:

zipnote example.zip > names

Buka nama menggunakan editor, tampilannya seperti ini:

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

Tambahkan nama file baru seperti ini:

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

Kemudian untuk mengganti nama file gunakan:

zipnote -w example.zip < names

Anda mengganti nama mereka semua, Anda juga dapat menulis skrip sederhana yang melakukan ini secara otomatis untuk Anda.

Ravexina
sumber
Itu sangat berguna, terima kasih! Saya tidak bisa membuat contoh zipnote berfungsi - dan yang pertama menghapus ekstensi file - tapi itu cukup baik untuk apa yang perlu saya lakukan. Terima kasih!
Terence Eden
Saya memperbarui jawabannya, sekarang ia akan mempertahankan ekstensi juga;)
Ravexina
Anda harus menggunakan IFS= read -r ijika nama file dimulai dengan spasi putih atau berisi hal-hal yang shell mungkin tafsirkan sebagai urutan melarikan diri.
David Foerster