【发布时间】:2018-12-02 01:23:31
【问题描述】:
我正在尝试重命名远程服务器中的文件名,例如 filename-dirname.suffix 并将文件复制到我的服务器。 我写过类似...的代码。
#!/usr/bin/bash
TRANSFERSERVERXMLS="/emp/transfer/XMLS"
REMOTESERVERXMLS="remoteemp/empdir/XMLS"
# renaming the filenames in remote server like filename-dirname.suffix
ssh abc@xyz REMOTESERVERXMLS=$REMOTESERVERXMLS 'bash -s'<< 'EOF'
for i in $REMOTESERVERXMLS/* ; do
if [[ -d $i ]]; then
dirname=$(basename $i)
for j in $REMOTESERVERXMLS/$dirname/* ; do
fname="$(basename "$j")"
prefix=$(echo $fname | awk -F "." 'NF{NF-=1};1')
suffix=$(echo $fname | awk -F "." '{print $NF}')
target=$prefix-$dirname.$suffix
mv $REMOTESERVERXMLS/$dirname/"$fname" $REMOTESERVERXMLS/$dirname/"${target// /_}"
done
fi
done
EOF
scp abc@xyz:${REMOTESERVERXMLS}/*/* ${TRANSFERSERVERXMLS}
出现错误:EOF:Command not found 并且 scp 不工作(无法复制到调用服务器)
【问题讨论】:
-
顺便说一句,考虑通过shellcheck.net 运行您的代码(您需要单独传递heredoc 中的代码,因为从外部脚本的角度来看,它只是一个字符串文字)。跨度>
-
...除了 heredoc 之外,您遇到的另一个问题是对传递的环境变量的依赖性,但我们还有其他问答条目,其中包含描述如何通过 ssh 可靠地传递变量的答案。 (
printf -v transferservenrxmls_q %q "$transferserverxmls",然后"bash -s $transferserverxmls"将从远程脚本的上下文中生成该值$1...如果我们知道远程用户的默认解释器是 bash;否则,事情会变得有点棘手)。跨度> -
...btw,注意这里使用了小写的变量名——见pubs.opengroup.org/onlinepubs/9699919799/basedefs/…的第四段