Архивировать файлы на сервере удаления, где имя файла имеет «ПРОБЕЛ» и специальный символ - PullRequest
0 голосов
/ 28 января 2019

Мне нужно архивировать файлы с системным временем на удаленном сервере, но имя файла содержит «ПРОБЕЛ» и специальный символ.Таким образом, приведенные ниже команды не работают.

FileName="BBB ABC@textfile.xml"
ts=`date +"%m%d%Y%H%M%S"`
 ssh remoteid@remoteserver "'mv /upload/hotfolders/in/"$FileName" 
 /upload/hotfolders/Archive/${FileName}_${ts}'"

Но приведенная выше команда не выполняется с приведенной ниже ошибкой.
bash: mv / upload / hotfolders / in / BBB ABC@textfile.xml / upload / hotfolders / Archive/ BBB ABC@textfile.xml_01282019050200: Нет такого файла или каталога

1 Ответ

0 голосов
/ 28 января 2019

В оригинальном предоставленном коде:

ssh remoteid@remoteserver 'cd /upload/hotfolders/; mv "$FileName"
    /upload/hotfolders/Archive/"${FileName}_${ts}"'

самые внешние ' используются в локальной файловой системе для хранения всех команд в качестве одного аргумента для ssh.Однако это означает, что $FileName и т. Д. Не расширяются локально!Вместо этого нерасширенные строки дословно передаются на удаленный сервер, где запускается оболочка для запуска команды.$FileName и т. Д., Затем расширяются там.Поскольку они там не определены (возможно), расширение не может дать ничего полезного.

В исправленной версии:

 ssh remoteid@remoteserver "'mv /upload/hotfolders/in/"$FileName" 
 /upload/hotfolders/Archive/${FileName}_${ts}'"

существует другая проблема.Здесь два набора самых внешних " позволяют локальной системе расширять переменные (хотя может быть не очевидно, что первый $FileName на самом деле не находится внутри ").Однако, поскольку переданная команда теперь заключена в ', удаленный сервер будет обрабатывать всю строку как одно слово.

Если предположить, что FileName и ts не будут содержать оболочку-специальные символы (такие как '), тогда исправление заключается в том, чтобы обернуть последовательность команд в " (чтобы она расширялась локально), и только обернуть переменные в ' (так, чтобы удаленный сервер обрабатывал теперь-расширенные строки как отдельные слова):

ssh remoteid@remoteserver "cd /upload/hotfolders/; mv '$FileName'
    /upload/hotfolders/Archive/'${Filename}_${ts}'"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...