Команда rsync в скрипте bash с использованием --from-files выдает ошибки rsync: link_stat

Short :Нет. Нельзя полагаться на имя дескриптора. И вы, скорее всего, никогда не будете.

Стандарт именования NVMe описывает:

  • nvme0 :контроллер устройства первого зарегистрированного устройства
  • nvme0n1 :первое пространство имен первого зарегистрированного устройства
  • nvme0n1p1 :первое зарегистрированное устройство первое пространство имен первое перегородка

Таким образом, общее название зависит от вашей физической компоновки. И это может измениться в зависимости от вашего варианта использования путем добавления/удаления блочных устройств, сбоев дисков и т. д.

В основном то же самое, что и с дескрипторами sd _.

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

В конце концов, обращение либо к UUID устройства, либо к PARTUUID по-прежнему является лучшей практикой, даже с NVMe. В зависимости от варианта использования ссылка на LABEL может быть более удобной.

0
18.04.2020, 10:14
1 ответ

Вы явно вызываете basenameдля каждого файла, найденного с помощью find, даже если они находятся в подкаталогах ниже /usr/bin/rig/cache. Это означает, что файл, подобный /usr/bin/rig/cache/subdir/myfile, будет отмечен как myfileв списке, указанном для опции --files-from=в rsync. Очевидно, что этого файла нет в /usr/bin/rig/cache, поэтому я ожидаю, что rsyncпожалуется на него.

Вместо этого вы можете использовать -print0вместо -exec basename {} \;с find, что даст полные пути ко всем найденным файлам, разделенные\0(nul )персонажи. Затем используйте --files-from=с этим результатом, а также используйте --from0, чтобы указать, что это список имен путей с нулевым -разделителем.

Затем в качестве исходного пути для rsyncиспользуйте admin@rig700:.

Итак, я предложил здесь две вещи:

  1. Используйте \0для разграничения имен путей, сообщаемых find(. Это единственный символ , который можно безопасно использовать для разграничения имен путей в системе Unix, поскольку в именах путей разрешены символы новой строки ).
  2. Заставьте findсообщать полные пути к файлам, которые должны быть скопированы, а затем используйте этот путь, как -с rsync.

В конце концов, ваша команда будет

rsync -e 'ssh -q' --no-perms --ignore-existing -vt \
    --from0 --files-from=<(
        ssh -q admin@rig700 'find /usr/bin/rig/cache -mmin -720 -type f -print0'
    ) --no-relative  admin@rig700: /usr/bin/rig/store

Опция--no-relative(или--no-R)необходима для того, чтобы пути, считанные через --files-from, воспринимались как абсолютные пути. Без этой опции у имени пути, такого как /usr/bin/rig/cache/somefile.txt, было бы удалено его начальное /и оно относилось бы к вашему домашнему каталогу на удаленном хосте.

Я также использовал ssh -q, как для выполнения команды findв удаленной системе, так и с опцией-e(--rsh)для rsync. Я сделал это, потому что ваш удаленный хост в противном случае печатает приветственный баннер . Этот баннер сбивает с толку rsync, поэтому мы должны отключить его печать, как для выполнения команды find, так и для rsync.

Резюме:

  1. Не запускать basenameдля файлов, найденных с помощью find.Вместо этого получите полные пути к ним из удаленной системы и используйте --no-relativeс rsync.
  2. Убедитесь, что баннер приветствия удаленного хоста не печатается.
0
19.03.2021, 02:28

Теги

Похожие вопросы