perintah untuk zip beberapa direktori menjadi file zip individual

40

Saya memiliki satu direktori yang berisi puluhan direktori di dalamnya.

Saya baru untuk baris perintah dan saya berjuang untuk datang dengan perintah yang akan zip setiap sub-direktori menjadi file sub-directory.zip yang unik.

Jadi pada akhirnya direktori utama saya akan diisi dengan semua sub-direktori asli saya, ditambah .zipfile yang sesuai yang berisi konten yang di-zip dari setiap sub-direktori.

Apakah hal seperti ini mungkin? Jika demikian, tolong tunjukkan saya bagaimana melakukannya.

Evster
sumber
Saya sarankan Anda mencari cara "untuk loop" dapat dilakukan di shell. Ada onliner yang dapat melakukan apa yang Anda inginkan, tetapi perulangan yang bagus akan jauh lebih jelas.
lynxlynxlynx
Jadi apakah itu berarti saya perlu menulis skrip shell terpisah, dan kemudian memanggil skrip itu dari baris perintah? Maaf untuk pertanyaan mendasar seperti itu. Meskipun saya memiliki beberapa pengalaman pemrograman hal ini baru bagi saya.
Evster

Jawaban:

76

Anda dapat menggunakan loop ini di bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iadalah nama dari variabel loop. */berarti setiap subdirektori dari direktori saat ini, dan akan menyertakan garis miring di nama-nama tersebut. Pastikan Anda cdke tempat yang tepat sebelum menjalankan ini. "$i"cukup beri nama direktori itu, termasuk trailing slash. Tanda kutip memastikan bahwa spasi putih dalam nama direktori tidak akan menyebabkan masalah. ${i%/}seperti $itetapi dengan garis miring dihapus, sehingga Anda dapat menggunakannya untuk membangun nama file zip.

Jika Anda ingin melihat cara kerjanya, sertakan echosebelum zipdan Anda akan melihat perintah yang dicetak alih-alih dijalankan.

MvG
sumber
Terima kasih, ini terlihat hebat! Namun satu masalah potensial yang saya pikirkan: apakah ini SEMUA zip direktori dalam setiap sub-direktori menjadi file terpisah? Saya hanya ingin zip subdirektori tingkat 1 sebagai file terkompresi tunggal. Saya tidak ingin membuat file zip tambahan untuk direktori 2 tingkat, 3-tingkat, dll ... Tolong beritahu saya jika itu masuk akal. Terima kasih lagi!
Evster
Hanya yang tingkat pertama seperti yang Anda minta.
lynxlynxlynx
*/Nama - nama setiap subdirektori langsung, bukan setiap direktori turunan. Jadi Anda hanya akan mendapatkan ritsleting untuk level paling atas, seperti yang Anda inginkan. Versi dengan echoitu akan menunjukkan aspek itu. Membuat zip setiap direktori bersarang ke dalam file sendiri sebenarnya akan lebih bermanfaat, dan mungkin sebaiknya dipecahkan dengan menggunakan find -type dtrik-trik lain.
MvG
1
@fritzmg: Pengujian lokal di Linux saya menunjukkan bahwa ya, file yang dimulai dengan titik disertakan. Ini akan menjadi properti alat Info-ZIP, bukan dari perintah yang saya berikan, jadi tergantung pada apa zipbiner Anda, Anda mungkin mendapatkan perilaku yang berbeda. Untuk juga membuat file zip untuk direktori tingkat atas (yaitu anak-anak dari direktori saat ini) dimulai dengan titik, Anda dapat menggunakan shopt -s dotglobuntuk membuat pola glob cocok dengan file yang tersembunyi juga.
MvG
1
Untuk membuat zip yang tidak memiliki direktori induk sebagai akarnya:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris