Saya di Ubuntu 16.04.
Saya memiliki folder dengan banyak file teks (hampir 12k). Saya perlu mengunggah semuanya ke situs web yang menerima .tar.gz
unggahan dan kemudian mendekompresinya secara otomatis, tetapi memiliki batas 10MB (10.000KB) per file (jadi khususnya setiap file harus didekompresi sendiri). Jika saya tar.gz
semua file ini, file yang dihasilkan adalah sekitar 72MB.
Yang ingin saya lakukan adalah membuat delapan .tar.gz
file, masing-masing ukuran / dimensi (ketat) lebih kecil dari 10000KB.
Atau, kita dapat mengasumsikan bahwa semua file di atas memiliki dimensi yang kira-kira sama, jadi saya ingin membuat delapan .tar.gz
file dengan masing-masing jumlah file yang kurang lebih sama.
Bagaimana saya bisa melakukan salah satu dari dua tugas ini?
Saya baik-baik saja dengan solusi yang melibatkan GUI, CLI atau scripting. Saya tidak mencari kecepatan di sini, saya hanya perlu dilakukan.
sumber
tar
melakukannya dengan menambahkan semua file mulai dengan pola tertentu hingga Anda memiliki semuanya. Ini dapat dengan mudah dituliskan tetapi tidak menjamin ukurannya akan lebih rendah dari 9MB yang Anda butuhkan. Anda bisa, bagaimanapun, secara manual menyesuaikan ukuran file-file yang terlalu besar dengan membaginya lebih lanjut.Jawaban:
Sepenuhnya tambal sulam dan sketsa kasar yang cepat, tetapi diuji pada direktori dengan 3000 file, skrip di bawah ini melakukan pekerjaan yang sangat cepat:
Cara Penggunaan
compress_split.py
Jalankan dengan direktori dengan file Anda sebagai argumen:
.tar.gz
file bernomor akan dibuat di direktori yang sama dengan tempat file tersebut.Penjelasan
Naskah:
EDIT
Secara otomatis membuat potongan berdasarkan ukuran dalam mb
Lebih canggih adalah dengan menggunakan ukuran maksimum (dalam mb) dari potongan sebagai argumen (kedua). Dalam skrip di bawah ini, potongan ditulis ke dalam file terkompresi begitu potongan mencapai (melewati) ambang batas.
Karena skrip dipicu oleh chunk, melebihi ambang, ini hanya akan berfungsi jika ukuran (semua) file secara substansial lebih kecil dari ukuran chunk.
Naskah:
Untuk berlari:
... di mana chunksize adalah ukuran input untuk perintah tar.
Dalam hal ini, perbaikan yang disarankan oleh @DavidFoerster disertakan. Terima kasih banyak !
sumber
tar
permintaan lebih lanjut dengan memberikan daftar file pada aliran input standar.tar
Anda dapat menentukan file untuk ditambahkan (atau diekstrak) pada input standar dengan opsi yang sesuai.Pendekatan shell murni:
Penjelasan
files=(*)
: simpan daftar file (juga direktori jika ada, ubahfiles=(*.txt)
untuk mendapatkan hanya hal-hal dengantxt
ekstensi) dalam array$files
.num=$((${#files[@]}/8));
:${#files[@]}
adalah jumlah elemen dalam array$files
. Ini$(( ))
adalah cara bash (terbatas) dalam melakukan aritmatika. Jadi, perintah ini mengatur$num
jumlah file dibagi 8.k=1
: hanya penghitung untuk memberi nama tarbal.for ((i=0; i<${#files[@]}; i+=$num)); do
: beralih di atas nilai-nilai array.$i
diinisialisasi pada0
(elemen pertama array) dan ditambahkan oleh$num
. Ini berlanjut sampai kita telah melalui semua elemen (file).tar cvzf files$i.tgz -- ${files[@]:$i:$num}
: dalam bash, Anda bisa mendapatkan irisan array (bagian dari array) menggunakan${array[@]:start:length}
, Jadi${array[@]:2:3}
akan mengembalikan tiga elemen mulai dari yang kedua. Di sini, kami mengambil potongan yang dimulai pada nilai saat ini$i
dan merupakan$num
elemen yang panjang. The--
diperlukan dalam hal apapun dari nama file Anda dapat memulai dengan-
.((k++))
: kenaikan$k
sumber