Rsync только файлы определенного пользователя

Rsync только файлы определенного пользователя

Есть ли способ rsync только файлов определенного пользователя? У меня есть папка, которая содержит файлы нескольких пользователей, но я хотел бы сделать резервную копию только файлов определенного пользователя.

Я посмотрел страницы руководства по rsync, но, похоже, такого флага там нет.

Есть идеи?

решение1

Нет, невозможно выделить файлы конкретного пользователя непосредственно из командной строки rsync.

Однако очень легко создать список этих файлов, например, с помощью такой команды:

   find /src/directory -type f -exec ls -lh {} \; | awk '{if ($3 == "your_name") for (i=1; i<=NF-8; i++) $i = $(i+8); NF-=8; print}'

findнаходит все файлы в дереве ниже /src/directory и выводит длинный список, включающий владельца, затем передает эти списки в awk, который выбирает те, которые принадлежат вам ("your_name"), а затем, только для них, выводит полный путь. Странная конструкция, начинающаяся с , forсвязана с тем, что некоторые имена файлов могут включать пробел, поэтому эта конструкция выводит все токены ( i.e., все последовательности символов, разделенные пробелом) с 9-го столбца (имена файлов могут включать произвольное количество пробелов). Кроме того, эта конструкция гарантирует, что это останется на одной строке.

Вы можете перенаправить этот вывод в файл, а затем использовать rsync только для файлов, перечисленных в этом файле.

решение2

Ответ MariusMatutiae мне не помог: я получил -rw-r--r--только массу строк.

Поэтому я разработал такой ответ:

  1. Команда findимеет опцию -user-group), которая намного проще в использовании. Нам нужны относительные пути/имена файлов:
    a) findопция: -printf '%P\n', или
    b) конвейер черезsed -e "s#/path##"
  2. rsync предлагает возможность синхронизации из файлов: . Вам нужен этот файл локально. Поэтому вам нужно отправить rsync файлы, или сервер, который их извлекает, должен сначала получить их с удаленной стороны, где список был сгенерирован ранее.--files-from=FILE

=> Для моего примера это работает:
1a) find /usr/share/piwik/ -user www-data -printf '%P\n' > /tmp/find-piwik-rsync.listили
1b)find /usr/share/piwik/ -user www-data | sed -e "s#/usr/share/piwik/##" > /tmp/find-piwik-rsync.list

2)rsync -a --files-from=/tmp/find-piwik-rsync.list /usr/share/piwik/ remote:/usr/share/piwik

Сначала вам следует протестировать его с помощью -n/ --dry-run.

Связанный контент