这是一个SFTP文件传输。
步骤如下:
- 检查
.csv
扩展名的文件并将其放入本地目录。 - 之后,将它们移动到远程连接中的另一个文件夹。
尝试使用该rename
命令但它引发错误“失败”
尝试使用-b
sftp 的批处理文件选项,但看起来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
显然rename
sftp 中的命令确实不是当源和目标位于不同的文件系统上时工作。
我在 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