我正在尝试通过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())/e 47 "'"$srcFolder"/*.txt"
要准备/验证命令行,请将ssh...bin/sh
替换为cat
:
cat <<<$'
rename 47use POSIX;s/$/strftime(".%F",localtime())/e 47 "'"$srcFolder"/*.txt"
将呈现如下内容:
rename 'use POSIX;s/$/strftime(".%F",localtime())/e' "/tmp/test dir"/*.txt
你可以本地尝试(确保$srcFolder
包含本地测试文件夹的路径):
/bin/sh <<<$'
rename 47use POSIX;s/$/strftime(".%F",localtime())/e 47 "'"$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