如果文件已经通过SSH存在于远程服务器上,我想更改它的名称。
我从here(超级用户)那里尝试过
bash
ssh user@localhost -p 2222 'test -f /absolute/path/to/file' && echo 'YES' || echo 'NO'
这在出现提示时效果很好,当文件存在时回显YES,否则显示NO。但是我希望从crontab启动它,然后它必须在脚本中。
我们假设该文件名为data.csv
,在循环中设置了一个条件,例如,如果服务器上已经有data.csv
文件,则该文件将重命名为data_1.csv
,然后data_2.csv
,...直到名称唯一。
重命名部分有效,但检测部分无效:
while [[ $fileIsPresent!='false' ]]
do
((appended+=1))
newFileName=${fileName}_${appended}.csv
remoteFilePathname=${remoteFolder}${newFileName}
ssh pi@localhost -p 2222 'test -f $remoteFilePathname' && fileIsPresent='true' || fileIsPresent='false'
done
对于任何fileIsPresent='true'
总是返回data_X.csv
。所有路径都是绝对的。
你有什么办法帮助我吗?
答案 0 :(得分:0)
这有效:
$ cat replace.sh
#!/usr/bin/env bash
if [[ "$1" == "" ]]
then
echo "No filename passed."
exit
fi
if [[ ! -e "$1" ]]
then
echo "no such file"
exit
fi
base=${1%%.*} # get basename
ext=${1#*.} # get extension
for i in $(seq 1 100)
do
new="${base}_${i}.${ext}"
if [[ -e "$new" ]]
then
continue
fi
mv $1 $new
exit
done
$ ./replace.sh sample.csv
no such file
$ touch sample.csv
$ ./replace.sh sample.csv
$ ls
replace.sh
sample_1.csv
$ touch sample.csv
$ ./replace.sh sample.csv
$ ls
replace.sh
sample_1.csv
sample_2.csv
但是,我个人更希望使用时间戳而不是数字。请注意,此示例将在100后用完名称。时间戳不会。像 $(date +%Y%m%d_%H%M%S)
之类的东西。
答案 1 :(得分:0)
在您寻求帮助的想法时,我想值得一提的是,您可能不想启动多达100个ssh
进程来登录到远程计算机,因此您最好使用一个这样的构造仅建立一个ssh
会话,该会话一直运行到完成:
ssh USER@REMOTE <<'EOF'
for ((i=0;i<10;i++)) ; do
echo $i
done
EOF
或者,您可以在本地创建和测试bash
脚本,然后像这样远程运行它:
ssh USER@REMOTE 'bash -s' < LocallyTestedScript.bash