Разделение большого дерева каталогов в блоки указанного размера?

Нет никакого лучшего ноутбука для Linux, потому что это в большой степени зависит от Вашего использования. Я рекомендовал бы получить ноутбук с предварительно установленным Linux.

Кроме этого я могу безопасно сказать, что Стремиться Временная шкала 1810T запускает Linux очень хорошо, но это - только субноутбук.

10
28.03.2011, 22:03
7 ответов

Там существует приложение, разработанное для этого: dirsplit

Это обычно живет в cdrkit или dirsplit пакеты.

Это может создать готовые к использованию папки со ссылками для легкого создания DVD с K3b или другим программным обеспечением GUI

6
27.01.2020, 20:00
  • 1
    Это работало действительно хорошо. В Ubuntu я нашел его в genisoimage пакет. –  nograpes 21.02.2014, 18:36

Я когда-то сделал ужасный сценарий для подобной цели. Это - просто клудж, но когда я записал это, я не заботился о времени выполнения или привлекательности. Я уверен, что существует больше "productified" версий того же понятия вокруг, но Если Вы хотите получить некоторое представление или что-то, чтобы начать взламывать на, здесь идет (сделал это в 2008, таким образом используйте на Ваш собственный риск!) :-)

#!/bin/sh -
REPO=/export/foton/PictureStore
LINKS=/export/foton/links
SPLITTIX=`date '+%y%m%d-%H%M'`

# kilobytes
DVDSIZE=4400000
PARTPREFIX="DVD-"
REPOSIZE=`du -sk -- ${REPO} | awk '{print $1}'`
NUMPARTS=`expr $REPOSIZE / $DVDSIZE`
SPLITDIR=${LINKS}/splits/${SPLITTIX}
mkdir -p -- "$SPLITDIR"

PARTNUM=1
PARTSIZ=0
DONESIZ=0
PARTNUM=`echo $PARTNUM | awk '{printf("%03x", $0)}'`
mkdir -p -- "${SPLITDIR}/${PARTPREFIX}${PARTNUM}"
for D in "${REPO}"/..?* "${REPO}"/.[!.]* "${REPO}"/*
do
  if [ ! -e "$D" ]; then continue; fi  # skip ..?*, .[!.]* and * if there are no matching files
  D=${D#$REPO/}
  D_SIZ=`du -sk -- "${REPO}/$D" | awk '{print $1}'`
  if test `expr $D_SIZ + $PARTSIZ` -le $DVDSIZE
  then
    # link to D in this part
    ln -s -- "$REPO/$D" "${SPLITDIR}/${PARTPREFIX}${PARTNUM}/$D"
    # adjust counters
    PARTSIZ=`expr $PARTSIZ + $D_SIZ`
    DONESIZ=`expr $DONESIZ + $D_SIZ`
  else
    # next part and link to D in that
    echo PART $PARTNUM: $PARTSIZ kb '(target' $DVDSIZE 'kb)'
    PARTNUM=`expr $PARTNUM + 1`
    PARTNUM=`echo $PARTNUM | awk '{printf("%03x", $0)}'`
    PARTSIZ=$D_SIZ
    DONESIZ=`expr $DONESIZ + $D_SIZ`
    mkdir -p -- "${SPLITDIR}/${PARTPREFIX}${PARTNUM}"
    ln -s -- "$REPO/$D" "${SPLITDIR}/${PARTPREFIX}${PARTNUM}/$D"
  fi
done
echo "wrote $DONESIZ kb in $PARTNUM parts in $SPLITDIR"

Я думаю, что мне совместно использовали результат через самбу к хосту окон, который записал диски от него. При использовании неизменного вышеупомянутого можно хотеть использовать mkisofs или другой archiver, который разрешает символьные ссылки.

2
27.01.2020, 20:00
  • 1
    я внес несколько изменений в Ваш сценарий для преодоления специальных символов в именах файлов (пробел, начальные тире и точки, \[?*). Предложенное чтение: не анализируйте вывод ls, $VAR по сравнению с $ {VAR} и заключить в кавычки или не заключить в кавычки. Обратите внимание, что я не протестировал получающийся сценарий. Если Вы не понимаете моих изменений, не стесняйтесь спрашивать. –  Gilles 'SO- stop being evil' 28.03.2011, 22:03
  • 2
    @Gilles: я сделал много чтения с 2008 ;-) Изменения для создания сценария более универсальным хороши. (Мне не нравится введение [ в противоположность test, хотя)... –  MattBianco 29.03.2011, 17:54
  • 3
    Вы должны нижний регистр большинство тех переменных. Условно, мы используем для своей выгоды переменные среды (ПЕЙДЖЕР, РЕДАКТОР, ОБОЛОЧКА...) и внутренние переменные оболочки. Все другие имена переменной должны содержать по крайней мере одну строчную букву. Эта конвенция старается не случайно переопределять переменные окружения и внутренние переменные. –  Chris Down 19.09.2011, 00:56

Я однажды записал сценарий для решения подобной проблемы - я звонил, это "распределяет" (можно прочитать основной код сценария или файла с сообщением справки, или загрузить его как пакет); из его описания:

распределите - Распределяют набор пакетов на нескольких CD (особенно хороший для будущего использования с APT)

Описание: 'распределите' программу, делает выполнение задач связанным с созданием набора CD для распределения набора пакетов легче. Задачи включают: разметка файловой системы CD (разделяющий большое количество пакетов в несколько дисков и т.д.), готовя набор к использованию APT (индексация), создание ISO-образов и запись дисков.

Периодические обновления первоначально распределенного набора могут быть выпущены со справкой, 'распределяют'.

Это делает целый процесс на нескольких этапах: однажды, это создает furure диск "разметки" при помощи символьных ссылок на исходные файлы - таким образом, можно вмешаться и изменить будущие дисковые деревья.

Детали о его использовании могут быть считаны в сообщении справки, распечатанном сценарием (или путем изучения исходного кода).

Это было записано с более более хитрым вариантом использования в памяти (выпускающий обновления как "разность" - набор добавленных новых файлов - к первоначально зарегистрированному набору файлов), таким образом, это включает один дополнительный начальный этап, а именно, "фиксируя" текущее состояние набора файлов (для простоты, это делает это путем тиражирования исходного набора файлов посредством символьных ссылок в специальном рабочем месте для сохранения состояний набора; затем, некоторое время в будущем, это сможет создать разность между будущим текущим состоянием набора файлов и этим сохраненным состоянием). Так, хотя Вам, возможно, не понадобилась бы эта функция, Вы не можете пропустить этот начальный этап, AFAIR.

Кроме того, я не уверен теперь (я записал это довольно много лет назад), обращается ли это со сложными деревьями хорошо, или это, как предполагается, разделяет только плоскость (один уровень) каталоги файлов. (Изучите сообщение справки или исходный код, чтобы быть уверенными; я буду искать это также немного позже, когда у меня будет некоторое время.)

Связанный с APT материал является дополнительным, не обращайте внимание, что это может подготовить наборы пакета, которые будут использоваться APT, если Вам не нужно это.

Если Вы заинтересованы, конечно, не стесняйтесь переписывать его к своим потребностям или предлагать улучшения.

(Обратите внимание, что пакет включает дополнительные полезные патчи, не примененные в представленном листинге кода в Мерзавце repo связанный выше!)

2
27.01.2020, 20:00
  • 1
    я представил - среди прочего - выборка кода от distribute это решает существенную задачу, о которой спрашивают здесь. –  imz -- Ivan Zakharyaschev 30.03.2011, 21:10

Мы не должны забывать, что сущность задачи действительно довольно проста; как вставлено учебное руководство на Haskell (то, которое записано вокруг работы через решения для этой задачи, инкрементно совершенствовало),

Теперь давайте думать на мгновение о том, как наша программа будет управлять и выражать это в псевдокоде:

main = Read list of directories and their sizes.
       Decide how to fit them on CD-Rs.
       Print solution.

Разумные звуки? Я думал так.

Давайте упростим нашу жизнь немного и предположим на данный момент, что мы вычислим размеры каталога где-нибудь вне нашей программы (например, с"du -sb *"), и читают эту информацию из stdin.

(от Автостопщиков ведут Haskell, Главе 1),

(Additionaly, в Вашем вопросе, требуется смочь настроить (редактируют) получающиеся структуры диска и затем используют инструмент для записи их.)

Вы могли снова использовать (адаптируйтесь и повторное использование), простой вариант программы, от что учебное руководство Haskell для разделения Вашего набора файла.

К сожалению, в distribute инструмент, который я упомянул здесь в другом ответе, простоте существенной задачи разделения, не подобран сложностью и чрезмерно увеличенный в размерах из пользовательского интерфейса distribute (потому что это было записано для объединения нескольких задач; хотя выполнено шаг за шагом, но все еще объединенный не самым чистым способом я мог думать теперь).

Чтобы помочь Вам некоторые использовать его код, вот, выборка из кода удара distributeстроке 380), который служит, чтобы сделать эту "существенную" задачу разделения набора файлов:

# Splitting:

function splitMirrorDir() {
  if [[ ! -d "$THIS_BASES_DIR/$BASE/$type" ]]; then
    echo $"No base fixed for $type" >&2
    exit 1
  fi

  # Getting the list of all suitable files:
  local -a allFiles
  let 'no = 0' ||:
  allFiles=()
  # no points to the next free position in allFiles
  # allFiles contains the constructed list
  for p in "$THIS_BASES_DIR/$BASE/$type"/*.rpm; do
      if [[ ! -e "$p" ]]; then
      # fail on non-existent files
      echo $"Package file doesn't exist: " "$p" >&2
      return 1 
      fi
      if [[ "$ONLY_REAL_FILES" == "yes" && ! -f "$p" ]]; then
      continue
      fi
      if [[ "$DIFF_TO_BASE" ]]; then
          older_copy="$DIFF_TO_BASE/$type/${p##*/}" # using shell param expansion instead of `basename' to speed up
          if [[ -h "$older_copy" || -a "$older_copy" ]]; then
          continue
      fi
      fi
      allFiles[$(( no++ ))]="$p"
  done
  readonly -a allFiles

  # Splitting the list of all files into future disks:
  # 
  local -a filesToEat allSizes
  let 'no = 0' ||:
  filesToEat=()
  allSizes=($(getSize "${allFiles[@]}"))
  readonly -a allSizes
  # allSizes contains the sizes corrsponding to allFiles
  # filesToEat hold the constructed list of files to put on the current disk
  # no points to the next free position in filesToEat
  # totalSize should hold the sum of the sizes 
  #  of the files already put into filesToEat;
  #  it is set and reset externally.
  for p in "${allFiles[@]}"; do 
      if (( totalsize + ${allSizes[$(( no ))]} > CDVOLUME )); then
      eatFiles "${filesToEat[@]}"
          filesToEat=()
          finishCD
      startTypedCD
    fi
      let "totalsize += ${allSizes[$(( no ))]}" ||:
      filesToEat[$(( no++ ))]="$p"
  done
  eatFiles "${filesToEat[@]}"
}

function eatFiles() {
    #{ oldIFS="$IFS"; IFS=$'\n'; echo "$FUNCNAME: args: " "$*" | head >&2;  IFS="$oldIFS"; }
    zeroDelimited "$@" | xargs -0 --no-run-if-empty \
    cp -s \
    --target-dir="$THIS_LAYOUTS_DIR/cd$(( cdN ))/$PREFIX/$type$DOT_SUFFIX"/ \
    --
}

function startTypedCD() {
#  set -x
  mkdir -p "$THIS_LAYOUTS_DIR/cd$(( cdN ))/$PREFIX/$type$DOT_SUFFIX"
  start_action $" %s with %s" "$(( cdN ))" "$type"
#  set +x
}

function finishCD() {

(читайте больше после строки 454),

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

Представленный сценарий (который можно взять и переписать к потребностям, конечно!) следует за самой простой идеей: суммировать размеры файлов (или, более точно, пакеты в случае distribute) только в порядке они были перечислены, не делайте никаких перестановок.

"Автостопщики ведут Haskell", относится к проблеме оптимизации больше серьезно и предлагает варианты программы, которые попытались бы перестроить файлы энергично для них, чтобы соответствовать лучше на дисках (и потребовать меньшего количества дисков):

Достаточно предварительных выборов уже. давайте пойдем, упаковывают некоторые CD.

Поскольку Вы, возможно, уже распознали, нашей проблемой является классическая. Это называют, "задача о ранце" (погуглите его, если Вы уже не знаете, каково это. Существует больше чем 100 000 ссылок).

давайте начнем с жадного решения...

(читайте больше в Главе 3 и далее.)

Другие умные инструменты

Мне сказали также, что Debian использует инструмент для создания его CD дистрибутива, который более умен, чем мой distribute наборы w.r.t. пакетов: его результаты более хороши, потому что это заботится о зависимостях межпакета и попыталось бы сделать набор пакетов, который входит в первый диск, закрытый под зависимостями, т.е. никакой пакет от 1-го диска не должен требовать пакета от другого диска (или по крайней мере, я сказал бы, количество таких зависимостей должно быть минимизировано).

2
27.01.2020, 20:00

backup2l может сделать большую эту работу. Даже если Вы не используете пакет непосредственно, Вы могли бы получить некоторые идеи сценария от него.

1
27.01.2020, 20:00

rar archiver может быть проинструктирован для автоматического разделения архива, который он создает в блоки определенного размера с -vsize флаг.

Архивацию того дерева каталогов называют foo в блоки, скажем, 500 мегабайтов за штуку Вы указали бы
rar a backup.rar -v500m foo/

0
27.01.2020, 20:00
  • 1
    Чем почему rar? tar (+bz2) + разделение является более собственным подходом для *, отклоняют. –  rvs 28.03.2011, 12:55
  • 2
    "крохотные деревья" не вполне походит rar, если Вы не распаковываете каждую "часть" снова в ее собственный каталог, который, конечно, не будет работать, так как части не разработаны как этот и не разделены на границах файла. –  MattBianco 28.03.2011, 14:16
  • 3
    При разговоре об инструментах, которые дают tar+split- как результаты, затем существует также dar; вот примечание о его соответствующей функции: "(ЧАСТИ), это было разработано, чтобы смочь разделить архив по нескольким съемным носителям вообще их число, и независимо от того, что их размер". По сравнению с tar+split, Я принимаю, это позволяет некоторым более легким способам получить доступ к заархивированным файлам. (BTW, это имеет также сходство функции distribute: "ДИФФЕРЕНЦИАЛЬНОЕ РЕЗЕРВНОЕ КОПИРОВАНИЕ" и "СНИМОК ДЕРЕВА КАТАЛОГОВ", но нельзя понравиться это, результатом является специальный формат, не ISO с деревом dir.) –  imz -- Ivan Zakharyaschev 30.03.2011, 02:43

Можно также попробовать fpart, инструмент, который я записал (BSD-лицензированный): https://sourceforge.net/projects/fpart/

5
27.01.2020, 20:00

Теги

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