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

时间:2016-05-25 17:47:25

标签: bash ssh sftp batch-rename

我正在尝试通过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上尝试了这个,没有这样的运气。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

通过SSH使用/发送变量时,需要注意什么是局部变量,哪个是远程变量。必须转义远程变量;否则它们将按照您的意图在本地和远程进行解释。其他角色也需要进行转义,例如反引号。以下示例应指向正确的方向:

不正确

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

主机1

正确

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

主机2

答案 2 :(得分:0)

试试这个:

使用rename工具):

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

要准备/验证命令行,请将ssh...bin/sh替换为cat

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

将呈现如下内容:

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

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

/bin/sh <<<$'
    rename \047use POSIX;s/$/strftime(".%F",localtime())/e\047 "'"$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进行预览。