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

Я пытаюсь переместить следующее перемещение большого количества файлов, которые существуют в следующей структуре, в / 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/ . . . 

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

 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 

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

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 ).

  • Создание списка файлов, удаление «дубликатов» с различным суффиксом
  • Сценарий в cron не может найти команду
  • Исправить файловую оболочку
  • Функция Bash присваивает значение переданному параметру
  • Скрипты `rm` и` rm -i`
  • Как данный скрипт делает исполняемые файлы в / usr / local / bin /
  • Как запустить ulimit в скрипте с другим приложением
  • Где «установить» приложение узла и лучший способ запуска
  • Обработка ввода для команды чтения как самой команды
  • Как убедиться, что встроенное эхо-сообщение оболочки вызвано так, что оно не отображается в списке процессов?
  • Простой сценарий оболочки Korn должен содержать список всех файлов, созданных / измененных после tidemark date
  • Linux и Unix - лучшая ОС в мире.