Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如果远程计算机上已经存在文件,如何更改文件名?_Bash_Ssh - Fatal编程技术网

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

Bash 如果远程计算机上已经存在文件,如何更改文件名?,bash,ssh,Bash,Ssh,如果文件已经通过SSH存在于远程服务器上,我想更改文件名 我从(超级用户)那里试过这个 这在提示下运行良好,当文件存在时回显YES,当文件不存在时回显NO。但我希望这是从crontab启动的,那么它必须在脚本中 假设该文件名为data.csv,在循环中设置了一个条件,例如如果服务器上已经有data.csv文件,则该文件将重命名为data_1.csv,然后重命名为data_2.csv。。。直到名称是唯一的 重命名部分起作用,但检测部分不起作用: 而[[$fileIsPresent!='false'

如果文件已经通过SSH存在于远程服务器上,我想更改文件名

我从(超级用户)那里试过这个

这在提示下运行良好,当文件存在时回显YES,当文件不存在时回显NO。但我希望这是从crontab启动的,那么它必须在脚本中

假设该文件名为
data.csv
,在循环中设置了一个条件,例如如果服务器上已经有
data.csv
文件,则该文件将重命名为
data_1.csv
,然后重命名为
data_2.csv
。。。直到名称是唯一的

重命名部分起作用,但检测部分不起作用:

而[[$fileIsPresent!='false']]
做
((追加+=1))
newFileName=${fileName}{u${added}.csv
remoteFilePathname=${remoteFolder}${newFileName}
sshpi@localhost-p 2222“test-f$remoteFilePathname”和&fileIsPresent='true'| | fileIsPresent='false'
完成
对于任何
数据\u X.csv
,始终返回
fileIsPresent='true'
。所有的路径都是绝对的

你有什么办法帮我吗?

这个方法很有效:

$ 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之后用完所有名称。时间戳不会。类似于
$(日期+%Y%m%d\u%H%m%S)

这样做:

$ 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\u%H%m%S)

当您寻求帮助时,我认为值得一提的是,您可能不想启动多达100个
ssh
进程来处理每个登录到远程机器的进程,因此,使用这样的构造可能会做得更好,它只建立一个运行到完成的
ssh
会话:

ssh USER@REMOTE <<'EOF'
for ((i=0;i<10;i++)) ; do
  echo $i
done
EOF

当您寻求帮助的想法时,我认为值得一提的是,您可能不想启动多达100个
ssh
进程来处理每个登录到远程机器的进程,因此您可以使用这样的构造来做得更好,它只建立一个运行到完成的
ssh
会话:

ssh USER@REMOTE <<'EOF'
for ((i=0;i<10;i++)) ; do
  echo $i
done
EOF

请添加一个shebang,然后将您的脚本粘贴到,并尝试实现那里提出的建议。@Cyrus此工具功能强大,非常感谢,它帮助了我很多!请添加一个shebang,然后将您的脚本粘贴到,并尝试实现那里提出的建议。@Cyrus此工具功能强大,非常感谢,它帮助了我很多!始终引用您的变量(因此
mv$1$new
应该是
mv“$1”“$new”
(或者更有力地
mv--“$1”“$new”
)和
$(seq 1100)
可以是
{1..100}
。始终引用您的变量(因此
mv$1$new
应该是
mv 1”“$new
(或者更有力地
mv--“$1”)“$new”
)和
$(seq 1 100)
可以是
{1..100}