补丁移动:文件备份和替换

时间:2018-05-30 10:15:30

标签: python python-3.x

我尝试将文件从包含错误修复程序/home/saurabh/testbed/patch_dir/的单个源目录复制到多个目标目录:app_dir_1app_dir_2时出错。

这两个目录都是彼此的精确复制品。

该脚本执行以下操作: -

  1. 将文本文件中的行读入列表。每行包含一个组件的名称。在这种情况下:[' file1.class',file2.html]

  2. 从特定目录开始递归搜索每个索引的值: /home/saurabh/testbed/dest_dir/

  3. 通过将 ddMonyyyy 附加到其扩展程序,将这些文件备份到任何位置。

  4. 从包含已修补组件的目录中复制文件:/home/saurabh/testbed/patch_dir/
    到之前进行备份的目录

  5. 目录概述: -

    /home/saurabh/testbed/dest_dir/ |--app_dir_1 |--file1.class |--file2.html |--file3.jsp |--file4.xml |--sub_dir |--app_dir_2 |--file1.class |--file2.html |--file3.jsp |--file4.xml |--sub_dir |--other_directories
    /home/saurabh/testbed/patch_dir/ |--file1.class |--file2.html

    以下是我的代码:

    #!/usr/bin/env python
    import os
    import fnmatch
    import datetime
    import shutil
    
    with open('filenames.txt') as f:
        content = f.readlines()
    content = [x.strip() for x in content]
    print('File contents:')
    print(content)
    
    suffix = datetime.datetime.now().strftime("_%d%b%Y")
    approot = '/home/saurabh/testbed/dest_dir/'
    source_dir = '/home/saurabh/testbed/patch_dir/'
    
    dir_list = []
    
    print('\n' + 'Renaming files present at:')
    for root, dirs, files in os.walk(approot):
        for file_list in content:
            for filename in fnmatch.filter(files, file_list):
                print(os.path.join(root, filename))
                dir_list.append(root)
                current_file = os.path.join(root, filename)
                backup_file = os.path.join(root, filename + suffix)
                os.rename(current_file, backup_file)
    
    print("\n" + "Backup of all files complete!")
    print('Backup of ' + str(len(dir_list)) + ' files taken recursively')
    print('Number of files mentioned in text file: ' + str(len(content)) + '\n')
    
    # 2 instances in UAT
    # 12 instances in PROD
    if (2*len(content)) == len(dir_list):
        print("Retrofitted components will be copied to their respective directories")
        for dst_ind in range(0, len(dir_list)):
            if filename in fnmatch.filter(files, file_list):
                print(source_dir + content[dst_ind] + "\t" + dir_list[dst_ind])
                #shutil.copy2(source_dir+content[dst_ind], dir_list[dst_ind])
    

    我在复制文件时遇到以下错误(4。)

    File contents:
    ['file1.class', 'file2.html']
    
    Renaming files present at:
    /home/saurabh/testbed/dest_dir/app_dir_1/file1.class
    /home/saurabh/testbed/dest_dir/app_dir_1/file2.html
    /home/saurabh/testbed/dest_dir/app_dir_2/file1.class
    /home/saurabh/testbed/dest_dir/app_dir_2/file2.html
    
    Backup of all files complete!
    Backup of 4 files taken recursively
    Number of files mentioned in text file: 2
    
    Retrofitted components will be copied to their respective directories
    /home/saurabh/testbed/patch_dir/file1.class     /home/saurabh/testbed/dest_dir/app_dir_1
    /home/saurabh/testbed/patch_dir/file2.html      /home/saurabh/testbed/dest_dir/app_dir_1
    Traceback (most recent call last):
      File "./prod_movement.py", line 56, in <module>
        print(source_dir + content[dst_ind] + "\t" + dir_list[dst_ind])
    IndexError: list index out of range
    

    预期输出:

    File contents:
    ['file1.class', 'file2.html']
    
    Renaming files present at:
    /home/saurabh/testbed/dest_dir/app_dir_1/file1.class
    /home/saurabh/testbed/dest_dir/app_dir_1/file2.html
    /home/saurabh/testbed/dest_dir/app_dir_2/file1.class
    /home/saurabh/testbed/dest_dir/app_dir_2/file2.html
    
    Backup of all files complete!
    Backup of 4 files taken recursively
    Number of files mentioned in text file: 2
    
    Retrofitted components will be copied to their respective directories
    /home/saurabh/testbed/patch_dir/file1.class     /home/saurabh/testbed/dest_dir/app_dir_1
    /home/saurabh/testbed/patch_dir/file2.html      /home/saurabh/testbed/dest_dir/app_dir_1
    /home/saurabh/testbed/patch_dir/file1.class     /home/saurabh/testbed/dest_dir/app_dir_2
    /home/saurabh/testbed/patch_dir/file2.html      /home/saurabh/testbed/dest_dir/app_dir_2
    

    感谢修复代码的任何帮助。

1 个答案:

答案 0 :(得分:0)

想出来!!

#!/usr/bin/env python
import os
import fnmatch
import datetime
import shutil

with open('filenames.txt') as f:
    content = f.readlines()
content = [x.strip() for x in content]
print('File contents:')
print(content)

suffix = datetime.datetime.now().strftime("_%d%b%Y")
approot = '/Users/saurabhm/Desktop/Python/testbed/dest_dir/'
source_dir = '/Users/saurabhm/Desktop/Python/testbed/patch_dir/'

dir_list = []

print('\n' + 'Renaming files present at:')
for root, dirs, files in os.walk(approot):
    for file_list in content:
        for filename in fnmatch.filter(files, file_list):
            print(os.path.join(root, filename))
            dir_list.append(root)
            current_file = os.path.join(root, filename)
            backup_file = os.path.join(root, filename + suffix)
            #print(current_file, backup_file)
            os.rename(current_file, backup_file)
            #print(source_dir + filename + "\t" + root)
            shutil.copy2(source_dir + filename, root)
            os.chmod(root + '/' + filename, 0o750)

print("\n" + "Backup of all files complete!")
print('Backup of ' + str(len(dir_list)) + ' files taken recursively')
print('Number of files mentioned in text file: ' + str(len(content)) + '\n')

通过电子邮件接收修补的组件后,它们将被复制到相应服务器中的目录中。所有这些文件都合并在一个目录(patch_dir)

现有文件的备份(具有相同的名称并出现在“dest_dir”中)将在任何位置进行,然后将每个文件从“patch_dir”复制到“dest_dir”内的目录,在这些目录中进行备份