如何在 python 中使用 pysmb 递归重命名嵌套目录和文件?

How to rename nested directories and files recursively using pysmb in python?

最近,我不得不重命名 Samba 树中目录和文件名中使用的所有 space 个字符。 在此之前,我使用os.walk遍历python中常规文件的目录树,但我想就地重命名它们。

为了连接到我的 Samba 服务器并重命名单个文件,我使用了这个片段:

from smb import SMBConnection

conn = SMBConnection.SMBConnection(userID, password, client_machine_name, server_name, is_direct_tcp=True, domain='workgroup')
assert conn.connect('1.2.3.4')

shares = conn.listShares()
    for share in shares:
        if share.name == 'share':
            conn.rename('share', 'path/old_name', 'path/new_name')

我的问题是当我将父目录重命名为新名称时,我无法再访问它们的子目录。如何使用 pysmb?

递归重命名旧目录和文件

最后我在 pysmb 中找到了一个示例代码如下 os.walk:

def smb_walk(conn, shareddevice, top='/'):
    dirs, nondirs = [], []
    if not isinstance(conn, SMBConnection.SMBConnection):
        raise TypeError("SMBConnection required")
    names = conn.listPath(shareddevice, top)
    for name in names:
        if name.isDirectory:
            if name.filename not in [u'.', u'..']:
                dirs.append(name.filename)
        else:
            nondirs.append(name.filename)
    yield top, dirs, nondirs
    for name in dirs:
        new_path = os.path.join(top, name)
        for x in smb_walk(conn, shareddevice, new_path):
            yield x

然后我从最里面的目录递归重命名目录和文件(因为重命名之前的文件路径名不会改变):

ans = smb_walk(conn, 'share', top=source_path)
smb_l = list(ans)
for s_i in smb_l[::-1]:
    for s_j in s_i[2][::-1]:
        if s_j:
            #rename file name
            conn.rename('share', f'{s_i[0]}/{s_j}', f'{s_i[0]}/{encode_n(s_j)}')
    for s_j in s_i[1][::-1]:
        if s_j:
            #rename directory name
            conn.rename('share', f'{s_i[0]}/{s_j}', f'{s_i[0]}/{encode_n(s_j)}')