我正在尝试通过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上尝试了这个,没有这样的运气。任何帮助将不胜感激!
答案 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
(perl工具):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
进行预览。