Как tar.gz много файлов одинакового размера в несколько архивов с ограничением размера

То, как я это делаю сейчас, это использовать клонезилу, как вы предлагаете, но затем переустановите ubuntu на клоне на этот раз, выбрав вариант сохранения файлов на существующей копии ubuntu. Он работает, но это занимает много времени.

1
задан 7 November 2016 в 08:45

1 ответ

Подход с чистой оболочкой:

files=(*); 
num=$((${#files[@]}/8));
k=1
for ((i=0; i<${#files[@]}; i+=$num)); do 
    tar cvzf files$k.tgz -- "${files[@]:$i:$num}"
    ((k++))
done

Объяснение

files=(*): сохранить список файлов (также есть каталоги, если они есть, изменить на files=(*.txt), чтобы получить только объекты с расширением txt) в массиве $files. num=$((${#files[@]}/8));: ${#files[@]} - количество элементов в массиве $files. [F9] - это байт (ограниченный) способ выполнения арифметики. Таким образом, эта команда устанавливает $num количество файлов, деленное на 8. k=1: просто счетчик, чтобы назвать архив. for ((i=0; i<${#files[@]}; i+=$num)); do: итерация по значениям массива. $i инициализируется в 0 (первый элемент массива) и увеличивается на $num. Это продолжается до тех пор, пока мы не рассмотрим все элементы (файлы). tar cvzf files$i.tgz -- ${files[@]:$i:$num}: в bash вы можете получить срез массива (часть массива) с помощью ${array[@]:start:length}, поэтому ${array[@]:2:3} вернет три элемента, начиная со второго. Здесь мы берем срез, который начинается с текущего значения $i и является $num элементами долго. [F21] необходим, если любое из ваших имен файлов может начинаться с -. ((k++)): increment $k
6
ответ дан 23 May 2018 в 04:28
  • 1
    Ницца! Впервые я видел практическое использование диапазонов индексов массива bash. – Joe 10 November 2016 в 09:53
  • 2
    Очень чистый и лаконичный. Для меня это более понятно, чем решения Python, хотя оба они довольно хороши. Интересно, как они все сравнивают производительность? – DocSalvager 10 November 2016 в 12:44

Другие вопросы по тегам:

Похожие вопросы: