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