Bergantung pada bagaimana file zip dibuat, kadang-kadang ia akan mengekstrak semua file secara langsung, dan kadang-kadang akan mengekstrak file ke dalam subdirektori.
Jika yang terakhir ini benar, bagaimana saya bisa memaksa unzip
perintah untuk "mengabaikan" direktori tingkat pertama itu?
Contoh:
cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll
Yang saya dapatkan adalah /tmp/omeka/omeka-1.5.1/
:
total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/
Yang saya inginkan adalah file yang diekstraksi /tmp/omeka/
, (satu tingkat dan tidak ada nomor versi yang termasuk dalam struktur direktori)
/tmp/omeka/(files)
Saya tahu saya bisa menggunakan -j
opsi untuk "jalur sampah" tetapi saya ingin mempertahankan struktur subdirektori, hanya saja bukan struktur direktori tingkat atas. Bagaimana saya bisa melakukan ini?
mv
file-file, tetapi saya ingin melihat apakah ada cara untuk melakukan ini langsung dari perintah unzip/wordpress/
direktori (tidak ada nomor versi) di dalam file zip. Memang baik untuk ituunzip
dan kemudian,mv
tetapi tidak memiliki kontrol ini dan harus melakukannya dalam dua langkah selalu membuat saya sedikit gugup. Untungnya Wordpress juga masuk dalam.tar.gz
citarasa :)cd /tmp/omeka && ln -s -T . omeka-1.5.1
Jawaban:
Gunakan sistem file FUSE yang memungkinkan Anda untuk menelusuri arsip seperti direktori, seperti AVFS . Gunakan
cp
untuk mengekstrak file ke direktori pilihan Anda.Karena kami mengasumsikan bahwa ada satu direktori tingkat teratas dalam arsip, Anda dapat mempersingkat ini menjadi
sumber
unzip
memiliki beberapa keajaiban untuk melakukan ini, seperti menentukan file yang akan diekstraksi seperti*/*
, yang dapat saya gunakan tanpa menginstal utilitas lain, tapi saya rasa tidak. Terima kasih. +1Jika file zip Anda tidak mengandung struktur direktori atau Anda tidak perlu menyimpannya, Anda dapat menggunakan ini:
sumber
Skrip ini tidak kuat, tetapi berfungsi dalam kasus sederhana:
Itu hanya memeriksa untuk melihat apakah ada satu subdirektori, dan jika demikian, memindahkan semuanya dari sana lalu menghapusnya.
sumber
Saya baru saja mendaftar hari ini, jadi saya tidak bisa menjawab dengan jawaban @SteveBennet dan tidak dapat menambahkan komentar di sana.
Berdasarkan jawabannya saya membuat fungsi rekursif seperti ini:
Seperti yang dikatakan @SteveBennet: skrip ini tidak kuat, tetapi berfungsi dalam kasus sederhana.
Semoga bermanfaat.
sumber
Perlu terlihat seperti
patch --strip=n
opsiAkan diinginkan untuk memiliki opsi seperti
patch --strip=number
(atau-pnumber
) yang memotongnumber
komponen path di awal (ref. Membandingkan dan Menggabungkan File: patch Direktori ).Solusi lain, penerapan
Gagal itu, ada solusi lain, jenis peretasan tetapi bekerja. Dalam kasus saya, saya ingin menimpa direktori yang penuh dengan file yang ada dengan isi zip, tanpa mengekstraksi zip penuh terlebih dahulu.
Ketika solusi ini bekerja dan solusi @ Gilles tersedia, yang terakhir juga akan berfungsi. Namun solusi ini tidak memerlukan ketersediaan sistem file FUSE.
Bagaimana cara melakukannya
Dengan asumsi Anda tahu direktori tambahan, dalam kasus
omeka-1.5.1
Anda, Anda dapat melakukan ini:unzip
akan mencoba unzipomeka-1.5.1
yang sebenarnya merupakan symlink ke berisi dir. Akibatnya, file akanomeka
langsung masuk.Varian yang mungkin
Anda dapat membayangkan varian untuk mengarahkan ulang satu atau lebih bagian dari hierarki depeer.
Kesimpulan
Solusi ini agak spesifik, namun memiliki kasus penggunaannya dan saya kebetulan menggunakannya.
sumber
unzip -l
. Ini bahkan bisa diotomatisasi menggunakan skrip yang menggambarkan bagian dari jalur yang umum.zipinfo -1
mungkin awal yang baik. Apa kasus penggunaan Anda?Kemungkinan besar Anda ingin menjalankan
unzip
dengan-j
pilihan, seperti pada:Tetapi Anda mungkin akan terkejut dengan perilakunya:
Jika Anda mengekstrak
files.zip
di direktori keluaran./output
dan Anda mendapatkan hasilnya:maka
-j
opsi akan memberi Anda ini (semua jalur bergaris-garis):sumber