【问题标题】:How to change name of file if already present on remote machine?如果远程机器上已经存在文件名,如何更改文件名?
【发布时间】:2020-10-30 00:48:22
【问题描述】:

如果文件已通过 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

对于任何data_X.csv,始终返回fileIsPresent='true'。所有的路径都是绝对的。

你有什么想法可以帮助我吗?

【问题讨论】:

  • 请添加一个shebang,然后将您的脚本粘贴到shellcheck.net 并尝试实施那里提出的建议。
  • @Cyrus 这个工具太强大了,非常感谢它对我帮助很大!

标签: bash ssh


【解决方案1】:

这行得通:

$ 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)

【讨论】:

  • 总是引用你的变量(所以mv $1 $new 应该是mv "$1" "$new"(或者更可靠的是mv -- "$1" "$new")并且$(seq 1 100) 可以只是{1..100}
【解决方案2】:

当您寻求帮助您的想法时,我认为值得一提的是,您可能不想启动多达 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 

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 2023-04-06
    • 2015-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    相关资源
    最近更新 更多