Intereting Posts
Запрос сертификата подписи с центром сертификации, созданным в openssl Почему мой обмен не активируется автоматически через fstab? Установка устройства с поддержкой MTP на Ubuntu 12.04.3 LTS 32-bit Как вернуться из поиска в исходную команду Как добавить неподвижное изображение внутри видео с помощью avconv или программного обеспечения с открытым исходным кодом Могу ли я автоматически отправлять с определенных адресов электронной почты в Mutt? Присоедините два файла с различным количеством столбцов и строк Возможно ли, чтобы nohup записывал выходные данные как в файл nohup.out AND, так и на экран / терминал? Есть ли какая-нибудь обертка для запуска приложений с графическим интерфейсом под поддельным разрешением экрана? Как перемонтировать модуль монтирования Systemd с различными параметрами? pacman и powerpill не работают Извлечение части строки с помощью grep / sed / awk Есть ли у Linux драйверы устройств для USB-портов? Можно ли указать команду at в одной строке? Сопоставить графическую активную область планшета для мониторинга подрайона в настройке с двумя мониторами

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

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

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

Один из вариантов – использовать 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 ).