Я на Ubuntu 16.04.
У меня есть папка с большим количеством текстовых файлов (почти 12k). Мне нужно загрузить их все на веб-сайт, который принимает .tar.gz
загружаемые файлы, а затем автоматически распаковывает их, но имеет ограничение 10 МБ (10000 КБ) на файл (поэтому, в частности, каждый файл должен быть распакован сам по себе). Если я tar.gz
все эти файлы, результирующий файл составляет около 72 МБ.
Я хотел бы создать восемь .tar.gz
файлов, каждый из которых имеет размер / размер (строго) меньше 10000 КБ.
В качестве альтернативы можно предположить, что все приведенные выше файлы имеют примерно одинаковое измерение, поэтому я хотел бы создать восемь .tar.gz
файлов с более или менее одинаковым количеством файлов в каждом.
Как я могу выполнить любую из этих двух задач?
Я совершенно в порядке с решением, которое включает в себя GUI, CLI или сценарии. Я не ищу скорость здесь, мне просто нужно это сделать.
источник
tar
их, добавив все файлы, начиная с определенного шаблона, пока у вас их нет. Это может быть легко написано в сценарии, но не гарантирует, что размер будет меньше, чем 9 МБ, как вам нужно. Однако вы можете вручную отрегулировать размер слишком больших файлов, разделив их дальше.Ответы:
Абсолютно лоскутная работа и быстрый, грубый набросок, как он есть, но протестированный на каталоге с 3000 файлами, приведенный ниже скрипт проделал чрезвычайно быструю работу:
Как пользоваться
compress_split.py
Запустите его с каталогом с вашими файлами в качестве аргумента:
Нумерованные
.tar.gz
файлы будут создаваться в том же каталоге, где находятся файлы.объяснение
Сценарий:
РЕДАКТИРОВАТЬ
Автоматически создавать куски по размеру в мб
Более сложным является использование максимального размера (в мб) кусков в качестве (второго) аргумента. В приведенном ниже сценарии чанки записываются в сжатый файл, как только чанк достигает (проходит) пороговое значение.
Поскольку сценарий запускается порциями, превышающими пороговое значение, это будет работать только в том случае, если размер (всех) файлов существенно меньше размера порции.
Сценарий:
Бежать:
... где chunksize - это размер ввода для команды tar.
В этом предложены улучшения, предложенные @DavidFoerster. Спасибо большое !
источник
tar
вызов, предоставив список файлов в стандартном потоке ввода.tar
позволяет вам указать файлы для добавления (или извлечения) при стандартном вводе с соответствующей опцией.Чистый подход к оболочке:
объяснение
files=(*)
: сохранить список файлов (также каталогов, если таковые имеются, измените на,files=(*.txt)
чтобы получить только вещи сtxt
расширением) в массиве$files
.num=$((${#files[@]}/8));
:${#files[@]}
количество элементов в массиве$files
. Это$(( ))
bash (ограниченный) способ выполнения арифметики. Итак, эта команда устанавливает$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
длину элемента.--
Требуется в случае , если какой - либо из ваших имен файлов может начинаться с-
.((k++))
: приращение$k
источник