Перемещение большого количества файлов (~ 100 000)

13

Я работаю с папками, которые содержат много файлов, например, 100 000 или даже 1 000 000 файлов в папке. Когда я пытаюсь переместить содержимое одной папки в другую, мой компьютер всегда зависает. Даже когда процесс кажется завершенным, я не вижу содержимого какой-либо папки, потому что nautilus кажется полностью замороженным, и мне приходится заставлять мой компьютер перезагружаться. Я заметил, что это происходит также, когда я пытаюсь переместить как 10 000 файлов.

Это проблема моего компьютера или это нормально при работе с этими числами?

Любой умный способ выполнить эту передачу файла?

Гиперион
источник
3
Как насчет использования терминала ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: В зависимости от файлов cp -a может быть лучше, потому что он сохраняет владельцев, временные метки и разрешения. Я также рекомендовал бы rsync, потому что он может проверять передачи и копировать только те файлы, которые еще не существуют.
Майкл
Обновление: gvfs-copy(из gvfs-binпакета) может быть быстрее, чем cp.
UniversallyUniqueID
У вас есть два вопроса вместо одного. Пожалуйста, проверьте страницу « Как спросить» для получения инструкций.
Луис де Соуза

Ответы:

19

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

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

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Некоторое объяснение этой команды:

  1. Ваш входной каталог - «.» символ и для этой конкретной команды вы должны быть в этом каталоге
  2. Ваш выходной каталог <destination>в моем примере. Очевидно, измените это в соответствии со своими потребностями и не включайте скобки.
  3. Этот синтаксис учитывает имена файлов с пробелами в качестве бонуса :)

Возможны бесконечные перестановки, но это должно работать хорошо и намного эффективнее, чем графический интерфейс. Например, одна перестановка: если вы хотите переместить только PDF-файлы, вы можете запустить:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Использование xargsоткрывает много возможностей, особенно при перемещении такого большого количества файлов. Много, много возможностей ....

Потенциальные проблемы:

Есть как минимум 2 потенциальных подводных камня для размышления, спасибо комментаторам ниже за эти мысли:

  1. Ваш целевой каталог может быть поврежден, в последующем недоступном месте, опечатке и т. Д. Все mvравно файлы будут перемещены туда! Будь осторожен ...
  2. Если -tопция ( --target-directory) отсутствует и целевая папка фактически является файлом, вы переместите один файл, а остальные потерпят неудачу. mvимеет 2 использования: переименовать источник в место назначения или переместить источник в каталог . Опять будь осторожен ...
andrew.46
источник
2
Не find . -maxdepth 1 -type f -exec mv -t test {} +сделал бы просто ?
Муру
@muru: Спасибо за это, я обрезал до посторонних -name...частей, но я оставил xargsна месте.
Андрей.46
2
Я не знаю ... Хотя команда, очевидно, является правильной в ее нынешнем виде, я бы посчитал, что полный ход слишком подвержен ошибкам. (Что, если вы, например, забудете включить -tфлаг? Я ​​думаю, что все файлы будут «перемещены» в один файл с именем test, что приведет к потере всех ваших файлов, кроме одного.) Я думаю, что я предпочел бы rsyncпосле, если все прошло правильно, а rm. Однако я могу представить сценарии, в которых такая проверка не может быть автоматизирована.
Йос
@Jos: Спасибо, я добавил примечание нижнего колонтитула, описывающее эту возможность. Приятно видеть rsync пример, написанный как ответ?
Андрей.46
Linux поддерживает очень длинные списки аргументов, так что вы, вероятно, можете это сделать mv dir1/* dir2и прибегнуть к ним только в find -execслучае возникновения проблемы или если вам нужно избегать сопоставления папок с вашим глобом. (Хотя, в зависимости от ваших соглашений об именах, часто *.*совпадает с большинством файлов, но не с большинством каталогов, так как обычно в .extensionфайлах есть .имена, а в именах каталогов - нет)
Peter Cordes
4

У меня был подобный опыт раньше, это нормально при работе с большим количеством файлов. У меня была большая коллекция PDF-данных (электронные компоненты).

Инструменты GUI проверяют некоторые детали файла и метаданные (Icon / Thumbnail, Size, ...), в этом случае это будет иметь большое значение. Даже в режиме просмотра иконок и без миниатюр они будут зависать, поскольку большинство из них не предназначены для такого экстремального случая. Инструмент с графическим интерфейсом попытается загрузить значки презентаций для всех файлов / папок в каталоге, даже если эти элементы не видны пользователю в текущей части экрана. Сортировка также является частью проблемы, и ее невозможно избежать.

  • В итоге я разбил файлы на отдельные папки по марке / модели менее 10000 каждая. Может быть, вы можете использовать дату (как большинство людей делают с фотографиями / сканы) или первые буквы (как в хранилище пакетов Ubuntu )
  • Вместо этого проще использовать инструменты CLI, поскольку они показывают только то, что вы запросили. Вы можете использовать locateдля быстрого поиска вместо find.
  • Для операции перемещения используйте mvв терминале (инструменты GUI работают медленно, потому что они пытаются периодически обновлять представление).

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

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

  • Создайте один пакет или несколько пакетов, например zip без / с низким сжатием. Когда вы копируете его, он будет работать быстрее, поэтому позвольте DMA выполнять свою работу.
user.dz
источник
3

Если вы ищете решение, которое дает вам преимущества операций командной строки с сочетанием графического интерфейса и гибкости, я рекомендую mc( Midnight Commander ).

mc commander 2-х панельный вид

Это визуальный файловый менеджер на основе ncurses - у вас есть двухпанельный просмотр ваших файлов и доступно меню. Использование мыши возможно даже поверх ssh. Вы можете просматривать файлы, просматривать файлы с помощью средства просмотра файлов, оперативно фильтровать их по критериям и выполнять операции копирования или перемещения в командной строке.

Это клон DOS-программы Norton Commander, популярной в середине восьмидесятых. Это работает хорошо, когда GUI начинает становиться ненадежным для меня, и идеально подходит для ваших целей.

emk2203
источник
0

Я столкнулся с некоторыми похожими проблемами - я тестировал настройки RAID и при выполнении огромных передач (например, 100 000+ файлов и 1-2 ТБ данных за один раз) кажется, что передачи начинаются довольно быстро - скажем, ~ 200 МБ / с, затем быстро замедлиться до приемлемого плато ~ 90-120 МБ / с (возможно, после использования некоторого объема флэш-памяти на дисках). Затем, через 20-30 минут, операция постепенно начинает падать до гораздо более низкого плато ~ 30-40 МБ / с, что еще хуже при работе с небольшими файлами - выполнение операции 4-5 часов ближе к 15 часам.

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

Для меня лучше всего было использовать полночь командира, и всякий раз, когда копирование происходило медленно, я приостанавливал операцию до тех пор, пока не погас свет индикатора жесткого диска после того, как какие-либо ожидающие операции исчезли - обычно через минуту или около того, - затем снова приостановил MC и это стреляло бы назад в приличный темп в течение еще 20-30 минут. Скорее раздражает, хотя.

М Сзил
источник