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

контекст

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

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

  • Не удается прочитать файл, хотя он находится в моей группе, и разрешены для чтения группы.
  • Может ли файл устройства в Linux указывать на несколько файлов?
  • Анализ производительности команды rsync с FreeNAS на USB-накопитель
  • Сравнение одного столбца файла с другим
  • rsync: использует ли невидимые файлы конфигурации?
  • Странный случай: текстовый файл, который существует и не существует
  • Это привело к двум проблемам: пользователь может заставить одно и то же имя файла перезаписать файл в резервной копии, а файл на 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/ (который имеет ограниченное дисковое пространство).

  • Могу ли я запретить создание файлов с определенными разрешениями?
  • Как вывести «разреженность» файла?
  • grep string из содержимого команды file, а затем удалить файл
  • Может ли rsync хранить подстановочные имена (возможно, используя переменную)?
  • объединить две папки с изображениями
  • В соответствии с тем, что GNOME очищает мусор «через 30 дней»?
  • 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/ 
    Linux и Unix - лучшая ОС в мире.