Перемещение большого количества файлов и каталогов в другой каталог

Я пытаюсь переместить следующее перемещение большого количества файлов, которые существуют в следующей структуре, в / mnt / оригиналы, но мне нужно поддерживать структуру в одно и то же время. Я знаю, что cp будет решением, но не может использовать cp из-за ограничений пространства.

/mnt/originals-us/4 /mnt/originals.us/4/0b9 /mnt/originals.us/4/0b8 /mnt/originals.us/4/0b4 /mnt/originals.us/4/0b3 /mnt/originals.us/4/0b9/a62/ /mnt/originals.us/4/0b9/a47/ /mnt/originals.us/4/0b9/f0f/ /mnt/originals.us/4/0b9/a62/aa5/file16.png /mnt/originals.us/4/0b9/a62/ba1/file1.png /mnt/originals.us/4/0b9/a47/31f/file3.mov /mnt/originals.us/4/0b9/f0f/ . . . 

И т. Д. Это довольно большой набор файлов с разными именами и типами файлов. Я попробовал следующее, но это не сработало.

  • дождаться предопределенного времени до выхода из сценария
  • Чтение char-by-char тихо не работает
  • Передача аргументов с кавычками и двойными значениями в сценарий bash
  • несколько фоновых процессов в скрипте
  • Как заставить скрипт использовать больше ресурсов?
  • Повторить последние команды N
  •  mv /mnt/originals-us/ /mnt/originals/ 

    но получить следующее

     mv: inter-device move failed: `/mnt/originals-us/10/0b9/' to `/mnt/originals/10/0b9'; unable to remove target: Is a directory 

    Я также думал о написании массивно chanin-ed команды, но я не думаю, что это сработает.

    Это то, что у меня есть до сих пор.

     find . -type f -print | rev | cut -d '/' -f1 | rev 

    Это, очевидно, дает мне все имена файлов, но как я могу связать его с первой частью?

  • условие && command + exit
  • Запуск команд из корневого каталога новой рабочей области
  • Построение URL-адресов со списком слов и загрузка из URL-адресов с помощью командной строки
  • bash эквивалент zsh $ @
  • Как использовать `gnome-terminal` с новой архитектурой клиент / сервер в качестве оболочки?
  • Как использовать namedpipe как временный файл?
  • 2 Solutions collect form web for “Перемещение большого количества файлов и каталогов в другой каталог”

    Один из вариантов – использовать rsync с --remove-source-files

     rsync -vr --remove-source-files /mnt/originals-us/ /mnt/originals/ 

    Потенциальная оговорка: я не знаю, как rsync проверяет пространство перед выполнением потенциально опасных действий. В идеальном мире rsync вычислил, сколько места потребуется, проверьте, доступно ли это, затем прервите и предупредите пользователя или (если достаточное пространство) выполните операцию.

    EDIT: я пропустил вариант рекурсии ( -r ) по ошибке, благодаря OP для упоминания, теперь исправлено

    Решение rsync намного эффективнее, но это возможно и при find . Наихудший случай: один процесс для файла:

     find ... -exec cp --parents {} /dest/path \; -delete 

    find удалит исходный файл только после успешной копии.

    Но мы можем начать проект «fun with find» для оптимизации (удалить echo сигналы и перед | после тестирования):

     find ... -type d -exec echo mkdir /target/{} \; -exec bash -c \ 'echo find {} -maxdepth 1 -type f -print0 \| '\ 'xargs -0 mv --target-directory=/target/{}' \; 

    В типичном случае: 5 процессов для каталога.

    В вашем примере (несколько файлов для каталога) может иметь смысл сделать -print0 | xargs -0 mkdir -print0 | xargs -0 mkdir в целевом корне сначала (и вывести mkdir из основного вызова на find ).

    Linux и Unix - лучшая ОС в мире.