Short :Нет. Нельзя полагаться на имя дескриптора. И вы, скорее всего, никогда не будете.
Стандарт именования NVMe описывает:
Таким образом, общее название зависит от вашей физической компоновки. И это может измениться в зависимости от вашего варианта использования путем добавления/удаления блочных устройств, сбоев дисков и т. д.
В основном то же самое, что и с дескрипторами sd _.
На что вы можете положиться, так это на порядок перечисленных разделов для каждого устройства,поскольку они сохраняются и считываются из таблицы разделов блочного устройства. Пока вы не измените расположение разделов, порядок останется прежним.
В конце концов, обращение либо к UUID устройства, либо к PARTUUID по-прежнему является лучшей практикой, даже с NVMe. В зависимости от варианта использования ссылка на LABEL может быть более удобной.
Вы явно вызываете 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:
.
Итак, я предложил здесь две вещи:
\0
для разграничения имен путей, сообщаемых find
(. Это единственный символ , который можно безопасно использовать для разграничения имен путей в системе Unix, поскольку в именах путей разрешены символы новой строки ). 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
.
Резюме:
basename
для файлов, найденных с помощью find
.Вместо этого получите полные пути к ним из удаленной системы и используйте --no-relative
с rsync
.