Подход с чистой оболочкой:
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
задан Jayo
8 May 2012 в 19:29
поделиться