更正 SFTP bash 脚本中的正则表达式
Correct Regex in SFTP bash script
我想自动执行 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"?
提前致谢
我认为您不需要正则表达式来解决这个问题。您可以通过以下 shell 命令获取目录中创建的最新文件,并将其分配给您的本地路径变量。
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'/'
如果你能正确获取文件名、源目录和目标目录,你可以直接使用scp
将文件复制到远程服务器:
sshpass -p $PASSWD scp $localpath $USER@$HOST:$remotepath
替换
put '$localpath' '$remotepath'
和
put "$(echo $localpath)" '$remotepath'
在您的 here-doc 中强制替换通配符 (*
)。
如果您的通配符被多个文件替换,这将不起作用。
我想自动执行 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"?
提前致谢
我认为您不需要正则表达式来解决这个问题。您可以通过以下 shell 命令获取目录中创建的最新文件,并将其分配给您的本地路径变量。
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'/'
如果你能正确获取文件名、源目录和目标目录,你可以直接使用scp
将文件复制到远程服务器:
sshpass -p $PASSWD scp $localpath $USER@$HOST:$remotepath
替换
put '$localpath' '$remotepath'
和
put "$(echo $localpath)" '$remotepath'
在您的 here-doc 中强制替换通配符 (*
)。
如果您的通配符被多个文件替换,这将不起作用。