如何在 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)}')
最近,我不得不重命名 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)}')