Python中如何将SFTP ls-lrt格式输出转为文件名-时间戳字典
实现SFTP文件列表的ls-lrt格式打印与字典转换
没问题,我来帮你搞定这个需求!下面是具体的实现步骤和代码,完全贴合你的要求:
1. 先搞定ls-lrt风格的打印
sftp.listdir_attr()返回的是SFTPAttributes对象列表,每个对象包含了文件的权限、大小、修改时间等元数据。我们需要把这些元数据转换成和ls -lrt一致的格式,核心是处理权限字符串和时间格式。
权限字符串转换函数
首先写一个小工具函数,把st_mode转换成类似-rwxr-xr-x的格式:
def get_permission_string(st_mode): # 先判断文件类型 file_type = '-' if stat.S_ISDIR(st_mode): file_type = 'd' elif stat.S_ISLNK(st_mode): file_type = 'l' # 然后处理权限位 permissions = [] # 所有者权限 permissions.append('r' if st_mode & stat.S_IRUSR else '-') permissions.append('w' if st_mode & stat.S_IWUSR else '-') permissions.append('x' if st_mode & stat.S_IXUSR else '-') # 组权限 permissions.append('r' if st_mode & stat.S_IRGRP else '-') permissions.append('w' if st_mode & stat.S_IWGRP else '-') permissions.append('x' if st_mode & stat.S_IXGRP else '-') # 其他用户权限 permissions.append('r' if st_mode & stat.S_IROTH else '-') permissions.append('w' if st_mode & stat.S_IWOTH else '-') permissions.append('x' if st_mode & stat.S_IXOTH else '-') return file_type + ''.join(permissions)
完整的打印逻辑
接下来结合SFTP连接,遍历文件并打印:
import paramiko import stat import time # 假设你已经建立了SFTP连接(这里是示例,实际请替换成你的连接逻辑) ssh_client = paramiko.SSHClient() ssh_client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh_client.connect('your_host', username='your_user', password='your_pass') sftp = ssh_client.open_sftp() # 遍历目标目录的属性 file_attrs = sftp.listdir_attr('/abc') # 按修改时间排序(对应ls -rt的从旧到新排序) file_attrs_sorted = sorted(file_attrs, key=lambda x: x.st_mtime) # 打印ls-lrt格式的内容 for attr in file_attrs_sorted: perm_str = get_permission_string(attr.st_mode) # 处理时间格式:最近6个月内的文件显示"日 月 时:分",更早的显示"日 月 年" mtime = attr.st_mtime local_time = time.localtime(mtime) if time.time() - mtime < 180 * 24 * 3600: # 180天约6个月 time_str = time.strftime('%d %b %H:%M', local_time) else: time_str = time.strftime('%d %b %Y', local_time) # 拼接所有字段并打印,对齐格式更贴近ls输出 print(f"{perm_str} 1 {attr.st_uid} {attr.st_gid} {attr.st_size:>5} {time_str} {attr.filename}") # 记得关闭连接 sftp.close() ssh_client.close()
2. 转换为文件名:时间戳的字典
这个就简单多了,遍历属性列表直接构建字典就行:
# 基于上面的file_attrs列表构建「文件名:时间戳」字典 file_timestamp_dict = {attr.filename: attr.st_mtime for attr in file_attrs} # 如果需要格式化后的时间字符串作为值(和打印格式一致),可以用这个: def get_formatted_time(mtime): local_time = time.localtime(mtime) if time.time() - mtime < 180 * 24 * 3600: return time.strftime('%d %b %H:%M', local_time) else: return time.strftime('%d %b %Y', local_time) file_formatted_time_dict = {attr.filename: get_formatted_time(attr.st_mtime) for attr in file_attrs} # 打印字典示例 print("\n文件名:时间戳字典:") for name, timestamp in file_timestamp_dict.items(): print(f"{name}: {timestamp}")
注意点
- 代码依赖
paramiko库,未安装的话先执行pip install paramiko - 权限转换只处理了普通文件、目录、软链接三种类型,如需支持更多类型(比如设备文件),可以扩展
get_permission_string里的文件类型判断 - 排序部分是按修改时间升序(对应
ls -lrt),如果要降序(对应ls -lr),把sorted的key改成lambda x: -x.st_mtime即可
内容的提问来源于stack exchange,提问作者user3399495
相关产品推荐
相关产品推荐

