如何通过 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"

试试这个:

通过使用rename(perl工具):

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

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

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

将呈现如下内容:

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

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

/bin/sh <<<$'
    rename 47use POSIX;s/$/strftime(".%F",localtime())/e47 "'"$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'

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

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

不對

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

主机1

正确

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

主机2

相关内容

  • 没有找到相关文章

最新更新