Правильное регулярное выражение в скрипте bash SFTP - PullRequest
1 голос
/ 26 апреля 2019

Я хочу автоматизировать процесс SFTP, чтобы передать последний файл, созданный на локальном сервере, и отправить его на удаленный сервер.

На локальном сервере у меня есть "/ Source / Path /" У меня есть файлы с именами, как показано ниже:

Logfile_2019-04-24
Logfile_2019-04-24_old.txt

Это мой текущий скрипт:

dyear=`date +'%Y' -d "1 day ago"`
dmonth=`date +'%b' -d "1 day ago"`
ddate=`date +%Y-%m-%d -d "1 day ago"`


HOST='192.168.X.X'
USER='user'
PASSWD='password'
localpath='/Source/Path/'$dyear'/'$dmonth'/'*$ddate*'.txt'
remotepath='/Destination/Path/'$dyear'/'$dmonth'/'

echo $localpath
echo $remotepath

export SSHPASS=$PASSWD
sshpass -e sftp $USER@$HOST << EOF
put '$localpath' '$remotepath'
EOF

Когда я делаю echo $localpath, он печатает правильный файл, но в скрипте я получаю эту ошибку:

Connecting to 192.168.X.X...
sftp> put '/Source/Path/2019/Apr/*2019-04-24*' '/Destination/Path/2019/Apr/'
stat /Source/Path/2019/Apr/*2019-04-24*: No such file or directory

Как будет правильным регулярным выражением в этой строке pasrt *$ddate*'.txt' in following:

    localpath='/Source/Path/'$dyear'/'$dmonth'/'*$ddate*'.txt'

для передачи файла "Logfile_2019-04-24_old.txt"?

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Замените

put '$localpath' '$remotepath'

на

put "$(echo $localpath)" '$remotepath'

для принудительной замены подстановочного знака (*) в вашем документе здесь.

Это не работает, если вашподстановочный знак заменяется несколькими файлами.

0 голосов
/ 26 апреля 2019

Если вы в состоянии правильно получить имя файла, каталоги источника и назначения, вы можете напрямую использовать scp для копирования файла на удаленный сервер:

sshpass -p $PASSWD scp $localpath $USER@$HOST:$remotepath
0 голосов
/ 26 апреля 2019

Я не думаю, что вам нужно регулярное выражение для этой проблемы.Вы можете получить последний файл, созданный в каталоге, с помощью следующей команды оболочки и назначить его переменной localpath.

ls -t directoryPath | head -n1

latestfile=`ls -t /Source/Path/$dyear/$dmonth | head -n1`
localpath='/Source/Path/'$dyear'/'$dmonth'/'$latestfile''
remotepath='/Destination/Path/'$dyear'/'$dmonth'/'
...