-1

我对 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","re​​port.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))
4

1 回答 1

0

(代表 OP 发布)

我没有意识到忽略参数需要是一个接受 2 个参数的可调用函数。我改变了它并返回了一个元组,它起作用了。我被困了2天。

    def copy_user_data(user_data):

        for datum in user_data:
            user = datum.split(":")[0]
            user_home = datum.split(":")[5]
            if os.path.exists(user_home):
                dest = os.path.join(TRANSPORT_DIRECTORY,user)

                shutil.copytree(user_home,dest,ignore=ignore_files)

    def ignore_files(path, names):
        files = ['.bashrc','.bash_profile','.ssh','.google_authenticator']
        ignore_list = []
        for file in os.listdir(path):
            if file not in files:
                ignore_list.append(file)
        return tuple(ignore_list)            
于 2017-03-27T19:04:31.363 回答