Unix环境下SFTP模式中给文件名追加时间戳重命名是否可行?
当然可以实现这个需求!不过SFTP本身的命令集里并没有直接支持动态生成时间戳的功能,得结合一些小技巧来完成,我分两种常见场景给你说明:
1. 交互式SFTP会话(手动操作)
如果你是在终端里手动连接SFTP服务器操作,步骤很简单:
- 先在本地shell窗口(注意不是SFTP会话内部)生成需要的时间戳,用
date命令就能搞定:
执行后会输出类似# 生成格式为YYYY-MM-DD-HHMMSS的时间戳 timestamp=$(date +"%Y-%m-%d-%H%M%S")2018-04-02-040404的字符串,把这个值记下来。 - 切换回SFTP会话,执行
rename命令,把时间戳替换进去:rename fileA.csv fileA-2018-04-02-040404.csv
2. 脚本自动化(批量/定时操作)
如果要自动完成这个重命名操作,比如定时任务或者批量处理,用shell脚本结合SFTP的批处理模式就很方便:
方法一:通过Here Document直接传递命令
这是最简洁的方式,不需要临时文件:
#!/bin/bash # 生成时间戳 timestamp=$(date +"%Y-%m-%d-%H%M%S") # 连接SFTP并执行重命名 sftp your_username@your_server_ip << EOF rename fileA.csv fileA-${timestamp}.csv quit EOF
方法二:使用SFTP命令批处理文件
如果需要执行多个SFTP命令,也可以先把命令写入临时文件再执行:
#!/bin/bash timestamp=$(date +"%Y-%m-%d-%H%M%S") # 生成SFTP命令文件 cat > sftp_cmds.txt << EOF rename fileA.csv fileA-${timestamp}.csv # 这里可以加其他SFTP命令,比如ls、get等 quit EOF # 执行SFTP操作 sftp your_username@your_server_ip < sftp_cmds.txt # 清理临时文件 rm sftp_cmds.txt
几个需要注意的点
- 确保你对目标文件拥有写权限,否则
rename命令会返回权限错误。 - 时间戳的格式可以通过
date命令的参数自由调整,比如想改成无分隔符的20180402040404,就用date +"%Y%m%d%H%M%S"。 - 如果文件名包含空格或特殊字符,记得用双引号包裹文件名,比如
rename "file A.csv" "file A-${timestamp}.csv"。
内容的提问来源于stack exchange,提问作者Eric




