Який найшвидший спосіб перемістити мільйон зображень з одного каталогу в інший в Linux?


14

У мене мільйон зображень, що займають 30 Гб місця на диску, які потрібно перемістити з одного локального каталогу в інший локальний каталог.

Який був би найефективніший спосіб зробити це? Використовуючи mv? Використовуючи cp? Використовуючи rsync? Щось ще?

Мені потрібно взяти такі:

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

і перемістіть їх сюди:

/path/to/new/img/dir/

5
Я не думаю, що ви можете перемогти mv, не залежно від продуктивності, якщо і вихідний, і цільовий каталоги перебувають у одній файловій системі.
Фредерік Хаміді

Відповіді:


26

rsync було б поганим вибором, оскільки це робить багато клієнтських / серверних фонових робіт, які припадають на локальні та віддалені системи.

mvце, мабуть, найкращий вибір. Якщо можливо, вам слід спробувати, mv directory_old directory_newа не mv directory_old/* directory_new/. Таким чином ви пересуваєте одне, а не мільйон речей.


6
+1 за порадою переміщати каталоги замість файлів.
Ex Exbrbris

4
Крім того, розширення підстановки може, можливо, порушити максимальний аргумент, підтримуваний, mvякщо ми говоримо про мільйони.
slhck

6
rsync просто обробляє передачі на локальних носіях. Це змушує такі речі, як -whole-файл (видаляючи реалізацію алгоритму дельти xfer) і запобігає іншим речам на зразок - компресії, які не виконують мети в локальних передачах. Якщо каталоги розміщені в різних файлових системах, 'mv' не забезпечить будь-якої продуктивності. Якщо вони перебувають у одній і тій же файловій системі, тоді просто 'mv' каталоги, як сказали ці люди.
UtahJarhead

Якщо зображень багато, використання простого підстановочного символу оболонки переповнить максимальний командний рядок.
Рауль Салінас-Монтеагудо

1
Переміщення між дисками все одно перемістить усі дані. На цьому ж диску mvпросто оновлення інформації про індекси mv directory_old directory_newпрацює так швидше, ніжmv directory_old/* directory_new
Аншул

14
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.
  • Переміщення всього каталогу, звичайно, набагато швидше, оскільки відбувається за постійний час незалежно від кількості файлів, що містяться в ньому, але:
    • вихідний каталог зникне на деякий час, і це може створити вам проблеми;
    • якщо процес використовує поточний каталог як вихідний каталог (на відміну від завжди посилається на повний шлях з місця, що не рухається), вам доведеться повторно запустити його. (як ви робите з обертанням журналу ).

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


Це досить добре для переміщення файлів через файлові системи на одному сервері. Добре, що я не переймався пошуком рішення в rsync. Звичайно, це пройшло годину чи дві, але це працює. Варто зазначити одне, якщо ви знайдете знайти ім'я каталогу, а не ". - не забудьте використовувати косую рису в команді find, інакше каталог буде відтворений у пункті призначення команди mv.
Speeddymon

7

Якщо два каталоги перебувають у одній файловій системі, використовуйте mvDIRECTORY, а не вміст каталогу.

Якщо вони розташовані у двох різних файлових системах, використовуйте rsync:

rsync -av /source/directory/ /destination

Зауважте, що йде /на джерело. Це означає, що він буде копіювати вміст каталогу, а не сам каталог. Якщо ви залишите /вимкнений, він все одно буде копіювати файли, але вони будуть знаходитись у каталозі з назвою /destination/directory. З файлами /, файли будуть просто в/destination

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


2
Для копіювання великої папки з одного жорсткого диска на інший жорсткий диск, rsyncсхоже, працює коло mv. Дякую за пораду!
leo-the-manic

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

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

Коли ви використовуєте 'cp', кожен файл робить відкрите читання-закриття-відкриття-запис-закриття. Тар використовує різні процеси для читання і запису, а також кілька протекторів для роботи над кількома файлами одночасно. Навіть на одній коробці процесора багатопотокові програми швидші.


2
Хоча це може відповісти на питання, було б кращою відповіддю, якщо ви могли б дати пояснення, чому це так.
DavidPostill

1
Якщо вони знаходяться на локальній машині, швидше за все, вони перебувають у тій же файловій системі. За допомогою tar c | tar xви отримаєте вартість O (TOTAL_SIZE) замість O (FILE_COUNT).
Рауль Салінас-Монтеагудо

1

Оскільки і каталог_old, і каталог_new знаходяться в одній файловій системі, яку ви можете використовувати cp -lзамість mvопції. cp -lстворить жорсткі посилання на вихідні файли. Коли ви закінчите з "переміщенням" і ви задоволені результатом, ви можете видалити ці файли з каталогу_old. з точки зору швидкості вона буде такою ж, як "mv", коли ви спочатку створюєте посилання, а потім видаляєте оригінальні. Але такий підхід дозволяє вам почати спочатку, якщо це має сенс


0

Це залежить (тм). Якщо ваша файлова система копіюється під час запису, копія ( cpабо rsync, наприклад) повинна бути порівнянна з переходом. Але в більшості поширених випадків переміщення ( mv) буде найшвидшим, оскільки воно може просто перемикати фрагменти даних, які описують, де розміщується файл (зверніть увагу: це надто спрощено).

Отже, на вашій середній установці Linux я б зайнявся mv.

EDIT: @ Frédéric Hamidi має хорошу думку в коментарях: Це справедливо лише в тому випадку, якщо вони знаходяться в одній файловій системі та на диску. Інакше дані все одно будуть скопійовані.


0

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

не вдається виконати / bin / cp: список аргументів занадто довгий

Найкращий варіант - Rsync:

rsync джерело цілі

І це було зроблено дуже швидко!


0

Якщо у вас є вільний простір, архівуйте їх в один .tar файл (без швидкого стиснення), а потім перемістіть цей файл і скасуйте його.


0

Характер пункту призначення визначав би найбільш ефективний спосіб виконання цього завдання. Давайте припустимо , що ви на локальну систему, ваше PWDце /прямо зараз. і /aмістить мільйони зображень. Наше завдання - перемістити всі зображення до /b, зберігаючи всю структуру підкаталогу. Давайте також припускаємо /aі /bє точками кріплення для двох різних розділів, кожен на локально підключеному диску. Ми хотіли б виконати це завдання за допомогою брезенту. Це може зайняти деякий час, тому переконайтеся , що ви використовуєте screen, tmuxабо ви виконуєте це як фоновий процес.

tar -C /a -cf . | tar -C /b -xf -

Це буде копіювати всі файли і каталоги в /aдо /b, так що тепер вам потрібно очистити , /aяк тільки ви переконаєтеся , що він виконаний без помилок.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.