如何通过 SSH 重命名所有文件

How to rename all files over SSH

我正在尝试通过 SSH 或 SFTP 重命名远程目录中的所有文件。重命名应该将文件转换为日期扩展名,例如 .txt 转换为 .txt.2016-05-25.

我有以下命令循环每个 .txt 文件并尝试重命名,但出现错误:

ssh $user@$server "for FILENAME in $srcFolder/*.txt; do mv $FILENAME $FILENAME.$DATE; done"

我得到的错误是:

mv: missing destination file operand after `.20160525_1336'

我也通过 SFTP 尝试过,但没有这样的运气。如有任何帮助,我们将不胜感激!

您需要转义(或单引号)远程 shell 中变量的 $。还建议引用代表文件路径的变量:

ssh $user@$server "for FILENAME in '$srcFolder'/*.txt; do mv \"$FILENAME\" \"$FILENAME.$DATE\"; done"

当using/sending通过SSH变量时,需要注意什么是局部变量,什么是远程变量。必须转义远程变量;否则,它们将按照您的预期在本地而不是远程解释。其他字符也需要转义,例如反引号。下面的示例应该为您指明正确的方向:

不正确

user@host1:/home:> ssh user@host2 "var=`hostname`; echo $var"

主机1

正确

user@host1:/home:> ssh user@host2 "var=\`hostname\`; echo $var"

主机2

试试这个:

通过使用rename工具):

ssh user@host /bin/sh <<<$'
    rename 7use POSIX;s/$/strftime(".%F",localtime())/e7 "'"$srcFolder\"/*.txt" 

到 prepare/validate 您的命令行,将 ssh...bin/sh 替换为 cat:

cat <<<$'
    rename 7use POSIX;s/$/strftime(".%F",localtime())/e7 "'"$srcFolder\"/*.txt" 

将呈现如下内容:

rename 'use POSIX;s/$/strftime(".%F",localtime())/e' "/tmp/test dir"/*.txt

您可以在本地尝试(确保 $srcFolder 包含本地测试文件夹的路径):

/bin/sh <<<$'
    rename 7use POSIX;s/$/strftime(".%F",localtime())/e7 "'"$srcFolder\"/*.txt" 

您自己的语法副本:

ssh $user@$server /bin/sh <<<'for FILENAME in "'"$srcFolder"'"/*.txt; do
     mv "$FILENAME" "$FILENAME.'$DATE'";
  done'

同样,您可以在本地测试您的 内联脚本 :

sh <<<'for FILENAME in "'"$srcFolder"'"/*.txt; do
    mv "$FILENAME" "$FILENAME.'$DATE'";
done'

或通过将 sh 替换为 cat 进行预览。