如果远程计算机上已经存在文件,如何更改文件名?

时间:2020-10-29 13:39:43

标签: bash ssh

如果文件已经通过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。所有路径都是绝对的。

你有什么办法帮助我吗?

2 个答案:

答案 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