如何通过 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
(perl工具):
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
进行预览。
我正在尝试通过 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
(perl工具):
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
进行预览。