我对 Python 有点陌生,但不是编码。我正在尝试让 copytree 工作,它确实可以工作,但它不适用于ignore_patterns
. 我认为这是因为我不知道如何将文件的变量列表发送到ignore_patterns()
函数。我尝试了一个列表和一个字符串。它说该列表不起作用,因为它不是一成不变的。我终于意识到,该字符串与任何内容都不匹配,因为它本质上是一个 CSV 列表。那么如何获取参数ignore_patterns
呢?
我在 Linux (AWSLinux) 上使用 Python 2.7。我已经导入了所有的包,所以这里是我写的函数本身:
def copy_user_data(shadow_data):
user_data = shadow_data.split(EOL)
files = ['file1','.file12']
dirs = ['dir1','.dir12']
for datum in user_data:
user = datum.split(":")[0]
user_home = datum.split(":")[5]
if os.path.exists(user_home):
ignore_list = []
for file in os.listdir(user_home):
if file not in files and file not in dirs:
ignore_list.append(file)
ignore_string = "'"+"','".join(ignore_list)+"'"
logger.info("Copying "+user_home)
logger.info("ignoring:"+ignore_string)
dest = os.path.join(TRANSPORT_DIRECTORY,user)
shutil.copytree(user_home,dest,ignore=shutil.ignore_patterns(ignore_string))
根据第一条评论,这是一个较小的示例。它将要求用户存在。
注意:当我使用字符串时没有错误消息。复制树复制所有文件和目录。如果我特别列出 ignore_patterns 中的参数(例如 ignore_patterns("useless.txt","report.pdf")),它会起作用并忽略这些文件。但它并没有用我传入的参数忽略它们。本质上,我不知道要传递什么数据结构才能让它工作。我尝试了格式为“file1,file2,file3”的字符串。我试过一个列表 ["file1","file2"],但我得到:
2017-03-27 11:12:01,748 - __main__ - CRITICAL - UNKNOWN ERROR:<type 'exceptions.Exception'>
Traceback (most recent call last):
File "./user_migration.py", line 133, in main
copy_user_data(passwd_data)
File "./user_migration.py", line 89, in copy_user_data
shutil.copytree(user_home,dest,ignore=shutil.ignore_patterns(ignore_list))
File "/usr/lib64/python2.7/shutil.py", line 173, in copytree
ignored_names = ignore(src, names)
File "/usr/lib64/python2.7/shutil.py", line 141, in _ignore_patterns
ignored_names.extend(fnmatch.filter(names, pattern))
File "/usr/lib64/python2.7/fnmatch.py", line 51, in filter
re_pat = _cache[pat]
TypeError: unhashable type: 'list'
较小的版本
import shutil
import os
users = ["bob","joe","list"]
files = ['.bashrc','.bash_profile']
dirs = ['.ssh','.google_authenticator']
for user in users:
user_home = os.path.join("/home",user)
if os.path.exists(user_home):
ignore_list = []
for file in os.listdir(user_home):
if file not in files and file not in dirs:
ignore_list.append(file)
ignore_string = "'"+"','".join(ignore_list)+"'"
dest = os.path.join("/var/tmp/move",user)
shutil.copytree(user_home,dest,ignore=shutil.ignore_patterns(ignore_string))