File size: 3,548 Bytes
2df809d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import os
import shutil
from tqdm import tqdm

# Set these paths to your original and moved locations.
src_base = "/path/to/processed_dl3dv"  # original location
dst_base = "processed_dl3dv_ours"  # current (moved) location

# Set dry_run to True for testing (no changes made), and False to perform the actions.
dry_run = False

def merge_directories(source_dir, destination_dir, dry_run=False):
    """
    Merge all contents from source_dir into destination_dir.
    If an item already exists in destination_dir:
      - For files: remove the destination file and move the source file.
      - For directories: merge them recursively.
    After moving items, empty directories are removed.
    """
    for item in os.listdir(source_dir):
        source_item = os.path.join(source_dir, item)
        dest_item = os.path.join(destination_dir, item)
        if os.path.isdir(source_item):
            if os.path.exists(dest_item):
                # Recursively merge subdirectories.
                merge_directories(source_item, dest_item, dry_run=dry_run)
                # Remove the source subdirectory if empty.
                if not os.listdir(source_item):
                    if dry_run:
                        print(f"[Dry-run] Would remove empty directory: {source_item}")
                    else:
                        os.rmdir(source_item)
            else:
                if dry_run:
                    print(f"[Dry-run] Would move directory: {source_item} -> {dest_item}")
                else:
                    shutil.move(source_item, dest_item)
        else:
            # For files: if a file already exists at the destination, remove it.
            if os.path.exists(dest_item):
                if dry_run:
                    print(f"[Dry-run] Would remove existing file: {dest_item}")
                else:
                    os.remove(dest_item)
            if dry_run:
                print(f"[Dry-run] Would move file: {source_item} -> {dest_item}")
            else:
                shutil.move(source_item, dest_item)

# Build a list of relative folder paths in dst_base.
# This assumes the structure is: dst_base/f1/f2
all_folders = []
for f1 in os.listdir(dst_base):
    f1_path = os.path.join(dst_base, f1)
    if not os.path.isdir(f1_path):
        continue
    for f2 in os.listdir(f1_path):
        all_folders.append(os.path.join(f1, f2))

# Process each folder and move/merge it back to the original location.
for folder in tqdm(all_folders, desc="Moving folders back"):
    original_folder = os.path.join(src_base, folder)  # target location in the original path
    moved_folder = os.path.join(dst_base, folder)       # current location

    # Ensure the parent directory of the original folder exists.
    parent_dir = os.path.dirname(original_folder)
    if dry_run:
        if not os.path.exists(parent_dir):
            print(f"[Dry-run] Would create directory: {parent_dir}")
    else:
        os.makedirs(parent_dir, exist_ok=True)

    if not os.path.exists(original_folder):
        if dry_run:
            print(f"[Dry-run] Would move folder: {moved_folder} -> {original_folder}")
        else:
            shutil.move(moved_folder, original_folder)
    else:
        merge_directories(moved_folder, original_folder, dry_run=dry_run)
        # Remove the moved folder if it becomes empty.
        if not os.listdir(moved_folder):
            if dry_run:
                print(f"[Dry-run] Would remove empty directory: {moved_folder}")
            else:
                os.rmdir(moved_folder)