У меня есть миллион изображений, занимающих 30 ГБ дискового пространства, которые необходимо переместить из одного локального каталога в другой локальный каталог.
Какой самый эффективный способ сделать это? Используя mv
? Используя cp
? Используя rsync
? Что-то другое?
Мне нужно взять это:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
и переместить их сюда:
/path/to/new/img/dir/
mv
зрения производительности вы сможете победить , если исходный и целевой каталоги находятся в одной файловой системе.Ответы:
rsync
было бы плохим выбором, потому что он выполняет большую часть клиент-серверной работы, которая учитывает как локальные, так и удаленные системы.mv
это, наверное, лучший выбор. Если возможно, вы должны попробовать,mv directory_old directory_new
а неmv directory_old/* directory_new/
. Таким образом, вы перемещаете одну вещь вместо миллиона вещей.источник
mv
если мы говорим о миллионах.mv
просто обновляет информацию обmv directory_old directory_new
mv directory_old/* directory_new
find -print0
сxargs -0
позволяет использовать пробелы в именах.xargs -r
не будет работать,mv
если нет чего-то для перемещения. (mv
будет жаловаться, если исходные файлы не указаны).mv -t
позволяет указать сначала место назначения, а затем исходные файлы, необходимые дляxargs
.Кстати, я бы спросил себя, действительно ли мне нужно перемещать такое большое количество файлов одновременно. Пакетная обработка переоценена. Я стараюсь не накапливать огромное количество работы, если могу обрабатывать вещи в тот момент, когда они генерируются.
источник
Если два каталога находятся в одной файловой системе, используйте
mv
каталог DIRECTORY, а не содержимое каталога.Если они находятся в двух разных файловых системах, используйте rsync:
rsync -av /source/directory/ /destination
Обратите внимание на трейлинг
/
на источнике. Это означает, что он будет копировать СОДЕРЖАНИЕ каталога, а не сам каталог. Если вы/
выключите, он все равно будет копировать файлы, но они будут находиться в каталоге с именем/destination/directory
. С / файлы просто будут в/destination
rsync
сохранит право собственности на файл, если вы запустите его от имени пользователя root или если файлы принадлежат вам. Он также будет поддерживатьmtime
каждого отдельного файла.источник
rsync
кажется, бегает кругамиmv
. Спасибо за совет!Когда вы используете 'cp', каждый файл делает open-read-close-open-write-close. Tar использует различные процессы для чтения и записи, а также несколько шагов для одновременной работы с несколькими файлами. Даже на одном процессоре многопоточные приложения работают быстрее.
источник
tar c | tar x
вы получаете стоимость O (total_size) вместо O (file_count).Так как directory_old и directory_new находятся в одной файловой системе, вы можете использовать ее
cp -l
вместоmv
опции.cp -l
создаст жесткие ссылки на оригинальные файлы. Когда вы закончили с 'move' и удовлетворены результатом, вы можете удалить эти файлы из directory_old. с точки зрения скорости он будет таким же, как «mv», когда вы сначала создаете ссылки, а затем удаляете исходные. Но этот подход позволит вам начать с самого начала, если это имеет смыслисточник
Это зависит (тм). Если ваша файловая система копируется при записи, то копирование (
cp
илиrsync
, например) должно быть сравнимо с перемещением. Но для большинства распространенных случаев move (mv
) будет самым быстрым, поскольку он может просто переключаться между фрагментами данных, которые описывают, где находится файл (примечание: это слишком упрощено).Итак, на вашей обычной установке Linux я бы пошел
mv
.РЕДАКТИРОВАТЬ: @ Фредерик Хамиди имеет хорошее замечание в комментариях: это верно только в том случае, если они оба находятся в одной файловой системе и на диске. В противном случае данные будут скопированы в любом случае.
источник
Чтобы скопировать как минимум ~ 10 тыс. Файлов (без каталогов), cp пожаловался:
Лучший вариант - Rsync:
И это было сделано очень быстро!
источник
Если у вас есть свободное место, заархивируйте их в один файл .tar (без сжатия быстрее), а затем переместите этот файл и разархивируйте его.
источник
Характер места назначения будет определять наиболее эффективный способ решения этой задачи. Давайте предположим , что вы на локальную систему, ваше
PWD
это/
прямо сейчас. и/a
содержит миллионы изображений. Наша задача - переместить все изображения/b
, сохраняя при этом всю структуру подкаталогов. Давайте также предположим ,/a
и/b
являются точки монтирования для двух различных разделов, каждый на локально подключенный диск. Мы хотели бы сделать эту задачу с брезентом. Это может занять некоторое время, поэтому убедитесь , что вы используетеscreen
,tmux
или вы выполняете это как фоновый процесс.Это будет копировать все файлы и каталоги в
/a
к/b
, так что теперь вам нужно очистить ,/a
как только вы убедитесь , что он выполнен без ошибок.источник