-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathflatten_folder.py
More file actions
95 lines (70 loc) · 2.42 KB
/
Copy pathflatten_folder.py
File metadata and controls
95 lines (70 loc) · 2.42 KB
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
87
88
89
90
91
92
93
94
95
#!/usr/bin/env python3
"""
将文件夹内的全部内容提取到上级目录,然后删除该文件夹
用于减少不必要的目录层级
用法:
python flatten_folder.py <folder1> [folder2] [folder3] ...
"""
import os
import sys
import shutil
from pathlib import Path
def flatten_folder(folder_path: Path) -> bool:
"""
将文件夹内容移动到上级目录,然后删除该文件夹
Args:
folder_path: 要处理的文件夹路径
Returns:
bool: 成功返回True,失败返回False
"""
if not folder_path.is_dir():
print(f"跳过: {folder_path} 不是文件夹")
return False
parent_dir = folder_path.parent
try:
print(f"正在处理: {folder_path.name}")
# 获取文件夹内所有内容
items = list(folder_path.iterdir())
if not items:
print(f" 文件夹为空,直接删除")
folder_path.rmdir()
print(f"完成: {folder_path.name}")
return True
# 移动所有内容到上级目录
for item in items:
dest = parent_dir / item.name
# 处理同名冲突
if dest.exists():
# 添加原文件夹名作为前缀
new_name = f"{folder_path.name}_{item.name}"
dest = parent_dir / new_name
print(f" 冲突: {item.name} -> {new_name}")
shutil.move(str(item), str(dest))
print(f" 移动: {item.name}")
# 删除空文件夹
folder_path.rmdir()
print(f"完成: {folder_path.name}")
return True
except Exception as e:
print(f"错误: 处理 {folder_path.name} 时失败 - {e}")
return False
def main():
if len(sys.argv) < 2:
print("用法: python flatten_folder.py <folder1> [folder2] ...")
print("请拖放文件夹到此脚本上,或通过右键菜单调用")
input("按回车键退出...")
sys.exit(1)
folders = [Path(arg) for arg in sys.argv[1:]]
success_count = 0
fail_count = 0
for folder in folders:
if flatten_folder(folder):
success_count += 1
else:
fail_count += 1
print(f"\n处理完成: 成功 {success_count}, 失败 {fail_count}")
# 如果是双击运行,暂停让用户看到结果
if os.environ.get('PROMPT'):
input("按回车键退出...")
if __name__ == '__main__':
main()