Рекурсивный ход (`mv -rn`, например` cp -rn`), перемещение, которое будет перемещать только файлы, не отображаемые

контекст

Я загрузил пользовательский контент, который необходимо скопировать. Содержимое содержит более 3 отдельных серверов в /var/www/domain/media/ (на каждом сервере он находится в одном месте). Резервная копия – это NFS-монтируемый RAID в /var/www/domain/bak/ .

media/ принадлежит другому пользователю, чем bak/ , в основном webapp может писать на media/ но может читать только bak/ (пользователи могут удалять их загрузку только до тех пор, пока они не будут скопированы в 00:00 GMT).

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

Все это работает на 4 CenOS 7 (web X 3 + backup X 1). «Веб-серверы» имеют ограниченное дисковое пространство, а перемещение на резервный сервер необходимо, чтобы они не заполняли диски.

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


Текущее решение

«Перемещение» файлов в резервную копию выполняется после очистки дубликатов:

 find /var/www/domain/media/ -type f | > media find /var/www/domain/bak/ -type f | awk '{a=gensub("bak","media",1); print a}' > bak cat bak media | sort | uniq -d > dupes cat dupes | xargs rm cp -r /var/www/domain/media/* /var/www/domain/bak/ rm -rf /var/www/domain/media/* 

Проблема с использованием mv заключается в том, что /var/www/domain/media/ имеет подкаталоги для каждого пользователя. Например:

 media/user13/myvideo.webm media/user13/walk-in-the-park.webm media/user16/cat-video.webm media/user17/presentation-may-2016.webm bak/user13/mountai-trip.webm bak/user13/walk-in-the-park.webm bak/user14/reax-the-dog.webm 

Команда должна создавать каталоги для user16 и user17 , в то время как она должна избегать перезаписи bak/user13/walk-in-the-park.webm .


Проблема с текущим решением

Я хотел бы сохранить дубликаты на media/ вместо их удаления. Копирование их в другое место относится к одной и той же проблеме, так как новые файлы появятся в течение дня, и мне нужно будет синхронизировать обман с их копиями.

Как я могу перемещать все файлы, которые не находятся в bak/ while, сохраняя структуру каталогов и не удаляя уже существующие файлы.

Другими словами, я ищу способ, который будет выполнять:

 source | destination | action ----------- | ------------------- | ---------------------------------- file exists | file does not exist | move (`mv`), source -> destination file exists | file exists | do nothing, both files stay as they are no file | file exists | do nothing (will not trigger) no file | file does not exist | do nothing (well, there's nothing to do something with!) 

Попытки более элегантного решения

Я считаю, что rsync сможет выполнить это. Я знаю --remove-source-files но я не могу найти способ, чтобы он не проверял отметки времени, контрольные суммы, размер файла, все.

Я сохраняю и проверяю контрольные суммы как совершенно отдельный процесс.

Меня интересуют только имена файлов. Я знаю, что это может привести к повреждению файлов, но я боюсь, что гораздо проще получить поврежденный файл на обычном диске, а не на сервере RAID.

rsync решения приветствуются. Я хочу написать сценарий shell для выполнения перемещения (расширьте скрипт из раздела Current solution ). Тем не менее, как только я, хотя, насколько склонна к ошибкам, я бы отказался.

Я также пробовал:

 tar -cf /var/www/domain/media | (cd /var/www/domain/bar; tar -kxf -) 

Но он слишком медленный для медиафайлов (что может быть довольно большим) и сохраняет все файлы на media/ (который имеет ограниченное дисковое пространство).

  • Синхронизация с Onedrive
  • Папка Rsync, в то время как --exclude-from'ing .gitignore файлы на разных глубинах
  • Передача содержимого блочного устройства по плохой сети
  • rsync --update и symlink не скопировали самую последнюю версию
  • Как синхронизировать два локальных каталога?
  • rsync от Mac ext hd до VPS работает, но не VPS для Mac
  • rsync удалить только исключенные файлы
  • Что держит одну сторону rsync настолько занятой?
  • One Solution collect form web for “Рекурсивный ход (`mv -rn`, например` cp -rn`), перемещение, которое будет перемещать только файлы, не отображаемые”

    Чтобы ничего не делать, если файл уже существует в дереве назначения (независимо от каких-либо метаданных), передайте параметр --ignore-existing в rsync.

     rsync -a --remove-source-files --ignore-existing /var/www/domain/media/ /var/www/domain/bak/ 
    Interesting Posts

    Ограничение пользователя SSH / SCP / SFTP в каталоге

    Строка печати содержит максимальное и минимальное значение

    Скопируйте / вставьте текстовые выделения между tmux и буфером обмена

    Считайте в реальном времени выходные строки из другой команды вывода

    Пакеты HTTP 302 для Iptables содержат подозрительную строку домена

    Отправьте задачу на фоновый рисунок в «if»

    Где регистрируются ошибки cron?

    Как создать контейнер systemd-nspawn?

    Apache не может получить доступ к файлу, пока имеет разрешение

    Любая команда для просмотра внутреннего размера фрагментации файловой системы в каталоге?

    Linux Mint: изменение карты дисков при перезагрузке приводит к ошибке fstab

    Разбор большого текстового файла, а затем запись в отдельные файлы вывод каждого

    Каковы шаги по устранению неполадок для устранения проблем беспроводной сети?

    Какой текстовый редактор использовал Томпсон и Ричи в написании Unix?

    Включить ключ блокировки прокрутки

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