在 SFTP 会话中重命名文件

在 SFTP 会话中重命名文件

这是一个SFTP文件传输。

步骤如下:

  1. 检查.csv扩展名的文件并将其放入本地目录。
  2. 之后,将它们移动到远程连接中的另一个文件夹。

尝试使用该rename命令但它引发错误“失败”

尝试使用-bsftp 的批处理文件选项,但看起来rename命令需要特定的文件名而不是一组文件。

那么我该如何实现这一目标呢?

答案1

对我有用,因此您需要提供有关该问题的更多信息:

chris@localhost$ finger 2> file.txt
chris@localhost$ sftp remotehost
Connected to remotehost.
sftp> ls -l file.txt
Can't ls: "/home/chris/file.txt" not found
sftp> ls -l file.tmp
Can't ls: "/home/chris/file.tmp" not found

# So the file doesn't exist on the remote in either form

sftp> put file.txt file.tmp
Uploading file.txt to /home/chris/file.tmp
file.txt                                                      100%  501     0.5KB/s   00:01
sftp> ls -l file.txt
Can't ls: "/home/chris/file.txt" not found
sftp> ls -l file.tmp
-rw-r-xr--    0 1001     1001          501 Aug 12 16:35 file.tmp

# It has arrived as file.tmp

sftp> rename file.tmp file.txt
sftp> ls -l file.txt
-rw-r-xr--    0 1001     1001          501 Aug 12 16:35 file.txt
sftp> ls -l file.tmp
Can't ls: "/home/chris/file.tmp" not found

# And been successfully renamed

答案2

显然renamesftp 中的命令确实不是当源和目标位于不同的文件系统上时工作。

我在 RedHat6、SLES9 等中看到了这种行为。

答案3

这可能并不完全是 OP 想要的,但是,我发现 sftp!command对于“在 SFTP 会话中重命名文件”很有帮助。

  • 来自 sftp 帮助:“!command - 在本地 shell 中执行‘命令’”

这是我在 SFTP 会话中的使用情况 - (本地:macOS Catalina,远程:Ubuntu 16.04.6 LTS)

sftp> lls
blankFileForVSCODEbrowser.txt   counties
sftp> !command mv  blankFileForVSCODEbrowser.txt blankFileForVSCODEbrowserRenameTest.txt
sftp> lls
blankFileForVSCODEbrowserRenameTest.txt counties

答案4

在 bash shell 中,您可以尝试执行以下操作(也可以将其缩小为 oneliner):

将远程 sftp $server/$dir 上的所有 csv 文件重命名为 txt(假设无密码访问):

for f in `echo 'ls *.csv' | sftp -qp $user@$server:$dir | grep -v ^sftp`; do
    echo "rename '$f' '${f%.csv}.txt'" | sftp -qp $user@$server:$dir ;
done

或者

# to move to $newpath folder:
for f in `echo 'ls *.csv' | sftp -qp $user@$server:$dir | grep -v ^sftp`; do
    echo "rename $f $newpath/${f##*/}" | sftp -qp $user@$server:$dir ;
done

在哪里

  • echo 'ls *.csv' | sftp $server:$dir- 在 $dir 目录中的远程 sftp 上运行 ls
  • ${f%.csv}.txt- 将变量 $f 中的 csv 替换为 txt
  • ${f##*/}- 从文件路径 $f 中删除路径(以防万一)

PS如果您需要启用交互式密码输入 - 尝试添加-o "BatchMode=no"参数sftp

相关内容