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

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

  • Как извлечь текущую дату Date Log из файла catalina.out
  • Базовое имя дает дополнительную ошибку операнда
  • Как сравнить два числа
  • Простой сценарий bash для резервного копирования и удаления каталогов
  • Короткий способ вызвать мой скрипт bash вместо использования команды Source
  • Терминал Ubuntu закрывается после запуска скрипта
  • dirname и basename против расширения параметров
  • Как я могу предоставить все разрешения для файла для одного пользователя, а не я?
  • Выполнение команд сразу
  • Как добавить пользователей в Linux через сценарий оболочки
  • Как передать имя функции тестируемому?
  • Interesting Posts

    Какую среду рабочего стола использует Maru OS?

    Как загрузчик и ядро ​​взаимодействуют после загрузки ядра в память?

    foomatic-configure создает странные предупреждения perl

    Сделать ключевой акт в качестве модификатора в сочетании с другим ключом

    vCenter 6, CentOS 7.3, клон от проблем с сеткой шаблонов

    grep внутри меньше?

    Поиск слов с определенными характеристиками в файле словаря

    Не удалось изменить разрешение на Fedora 18 после игры Urban Terror

    Несоответствия между перенаправлением ввода из файла, здесь docs и здесь строки

    клавиши left + up + space не работают на thinkpad x201

    По соглашению, куда пакеты идут, чтобы установить на другие машины?

    dd показывает случайное количество записей в / выводе

    Можно ли просто скопировать / dev / random и / dev / urandom?

    Использование chown $ USER: $ USER внутри сценария bash

    Perl-скрипт, извлекающий веб-ссылки с использованием регулярного выражения

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