10

У меня есть миллион образов, 30 ГБ дискового пространства, которые нужно переместить из одного локального каталога в другой локальный каталог.

Какой будет самый эффективный способ? мв? ф? Rsync? Что-то другое? Подсказки?

/path/to/old-img-dir/*
                     00000000.jpg
                     --------.jpg  ## nearly 1M of them! ##
                     ZZZZZZZZ.jpg

Переместите их сюда:

/path/to/new/img/dir/

8 ответов8

21

rsync будет плохим выбором, потому что он выполняет много фоновой работы клиент / сервер, которая учитывает как локальные, так и удаленные системы.

mv , вероятно, лучший выбор. Если возможно, вы должны попробовать mv directory_old directory_new а не mv directory_old/* directory_new/ . Таким образом, вы перемещаете одну вещь вместо миллиона вещей.

12
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • Это не будет переполнять расширение аргумента.
  • Вы можете указать расширение файла, если хотите. (-название ...)
  • find -print0 с xargs -0 позволяет использовать пробелы в именах.
  • xargs -r не запустит mv если не будет чего-то перемещенного. (mv будет жаловаться, если исходные файлы не указаны).
  • Синтаксис mv -t позволяет указать сначала место назначения, а затем исходные файлы, необходимые для xargs .
  • Перемещение всего каталога, конечно, происходит намного быстрее, поскольку оно происходит в постоянное время независимо от количества файлов, содержащихся в нем, но:
    • исходный каталог исчезнет на долю времени, и это может создать вам проблемы;
    • если процесс использует текущий каталог в качестве выходного каталога (в отличие от всегда ссылающегося на полный путь из неподвижного местоположения), вам придется перезапустить его. (как вы делаете с ротацией журнала).

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

5

Если два каталога находятся в одной и той же файловой системе, используйте mv для DIRECTORY, а не для содержимого каталога.

Если они находятся в двух разных файловых системах, используйте rsync:

rsync -av /source/directory/ /destination

Обратите внимание на трейлинг / источник. Это означает, что он будет копировать СОДЕРЖАНИЕ каталога, а не сам каталог. Если вы оставите / off, он все равно будет копировать файлы, но они будут находиться в каталоге с именем /destination/directory . С / файлы просто будут в /destination

rsync сохранит право собственности на файл, если вы запустите его от имени пользователя root или если файлы принадлежат вам. Он также будет поддерживать mtime каждого отдельного файла.

1

Так как directory_old и directory_new находятся в одной файловой системе, вы можете использовать cp -l вместо mv в качестве опции. cp -l создаст жесткие ссылки на оригинальные файлы. Когда вы закончили с 'move' и удовлетворены результатом, вы можете удалить эти файлы из directory_old. с точки зрения скорости он будет таким же, как «mv», так как вы сначала создаете ссылки, а затем удаляете исходные. Но этот подход позволит вам начать с самого начала, если это имеет смысл

0

Если у вас есть свободное место, заархивируйте их в один файл .tar (без сжатия быстрее), а затем переместите этот файл и разархивируйте его.

0

Это зависит (тм). Если ваша файловая система копируется при записи, то копирование (например, cp или rsync) должно быть сравнимо с перемещением. Но в большинстве распространенных случаев перемещение (mv) будет самым быстрым, поскольку оно может просто переключаться между фрагментами данных, которые описывают место размещения файла (примечание: это слишком упрощено).

Итак, на вашей обычной установке Linux я бы mv .

РЕДАКТИРОВАТЬ: @ Фредерик Хамиди имеет хорошее замечание в комментариях: это верно только в том случае, если они оба находятся в одной файловой системе и на диске. В противном случае данные будут скопированы в любом случае.

0

Чтобы скопировать как минимум ~ 10k файлов (без каталогов), cp пожаловался:

невозможно выполнить /bin /cp: список аргументов слишком длинный

Лучший вариант - Rsync:

rsync исходная цель

И это было сделано очень быстро!

-1
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

Когда вы используете 'cp', каждый файл делает open-read-close-open-write-close. Tar использует различные процессы для чтения и записи, а также несколько шагов для одновременной работы с несколькими файлами. Даже на одном процессоре многопоточные приложения работают быстрее.

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