в одном каталоге содержится около 7000000 файлов, общей емкостью до 650 ГБ.

(перечисление их в одиночку даже невозможно)

какие варианты у меня есть, чтобы загрузить их?

я думал об использовании tar для создания пакетов по 1 ГБ, а затем загружал их.

или, возможно, переместить их по частям в разные каталоги, чтобы их было проще перечислить.

ОС является сервером Ubuntu.

каждый раз, когда был добавлен файл, в базу данных вносилась запись, и количество теперь там> 7000000. Это также означает, что я знаю их имена.

2 ответа2

1

Это основной пита:

  • все упомянутые программы, все, что использует любой вариант ls будут аварийно завершены
  • вы должны следить за прогрессом другими способами
  • Вы должны удалить стресс из файловой системы
  • Вы должны избегать дублирования ситуации, в которой вы находитесь. rsync продублирует ситуацию. сырая tar будет дублировать ситуацию. Вы не хотите иметь 7000000 копий в другой папке.

Хорошо, учитывая, что может работать в этой ситуации:

  • выбрать питона или что вы знаете лучше.
  • поговорите с базой данных и получите имена файлов по 1000 штук.
  • скопируйте эти 1000 файлов в другой каталог и заархивируйте в этот каталог / tar, чтобы отправить его куда-нибудь еще. То, как и если вы удалите эти связанные файлы, немного зависит от объема хранилища на этом диске. хранение 7000000 файлов (независимо от того, как они организованы) в той же файловой системе - это стресс.
  • если этот блок из 1000 работал нормально и все в порядке, запишите наибольший идентификатор для этого чанка в другую таблицу базы данных (вы не хотите ALTER TABLE для этой вещи 7000000, чтобы просто добавить новый столбец 'Move', это может занять слишком долго и вы меняете "правду"; создайте 2-ю таблицу и отследите прогресс)
  • повторение.

самое главное: скопируйте, проверьте, а затем удалите исходные файлы в этой огромной папке.

также неразумно копировать файлы 1:1 в другое место, поскольку вы бы повторили плохую ситуацию, в которой находитесь сейчас.

удачи.

1

Если вы перечислите имена файлов в файле с именем ~/filelist.txt , а затем перейдите в каталог, где находятся все файлы, следующий скрипт должен переместить их в подкаталоги с управляемым размером, по одному на каждый день, когда файлы были созданы:-

cat ~/filelist.txt |                                           \
while f=`line`;                                                \
do ( d="`ls -l --time-style=+%y-%m-%d "$f"|awk '{print $6}'`"; \
     [ -d "$d" ] || mkdir "$d";                                \
     mv "$f" "$d"/                                             \
   )                                                           \
done

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

Я предлагаю вам сначала проверить его, прежде чем начать, используя head вместо cat и добавляя echo к командам mkdir и mv . Конечно, для этого теста mkdir будет неоднократно перечисляться для файлов с одинаковой датой, поскольку каталоги фактически не создаются. Если вы повторите с head -n 1000 или более, вы должны получить представление о том, сколько файлов попадет в каждый каталог.

Если их слишком много или слишком мало, вы можете изменить формат стиля времени, чтобы сделать его еженедельным или ежечасным архивом. Вы должны стремиться к 1000-10000 файлов в каждом каталоге, что даст вам 700-7000 каталогов, оба управляемых.

После того, как они перемещены в подкаталоги, вы можете сжать каждый каталог, что должно дать вам около 7000 файлов для перемещения и небольшую часть 650 ГБ для копирования, если они являются текстовыми файлами.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .