Python删除macOS产生的冗余文件

利用Python删除磁盘中macOS产生的冗余文件

特别说明:

请不要在macOS下运行此脚本,因为这些文件对于macOS来说是可能必须的。

使用此Python脚本或其中部分代码导致的个人文件被删除,本人概不负责。

请确认你有足够的能力应对各种突发情况,再使用此代码。

起因

由于我的U盘需要经常在各个系统之间拷贝、移动文件,所以其中难免会被创建很多在其他系统平台没用的文件。

比如Windows下会创建System Volume Information目录

Android平台下会创建.android_secure目录

相对于上面两个,macOS就比较难搞,不仅根目录下会有.fseventsd .Spotlight-V100 .Trashes文件夹,各个目录下还会存放.DS_Store目录信息文件,最要命的还是每打开一个文件就会创建一个._<原文件名>.<原扩展名>的一个文件,有时候会误打开甚至把不智能的设备搞死机。

基本思路

利用正则表达式匹配文件目录中的._开头,以及.DS_Store文件,把它们移动到备份文件夹。

备份的目的就是防止正则表达式匹配到同样以._开头的正 ♂ 常文件,需要手动确认后在一键删除。

代码

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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# encoding:UTF-8

import os
import shutil
import re
import time
import sys


def delAll(path):
"""delAll 删除备份文件夹

Args:
path (str): 备份文件夹位置
"""
print("备份文件夹:", path)
print("是否清空备份文件夹?(yes / no)")
try:
s = input("> ")
except KeyboardInterrupt:
print("Abort.")
sys.exit(0)
if s.lower() in ["yes", "y"]:
for fileList in os.walk(path):
for name in fileList[2]:
os.remove(os.path.join(fileList[0], name))
shutil.rmtree(path)
if not os.path.exists(path):
print("删除成功!")
print("Abort.")
time.sleep(1)
sys.exit(0)
else:
print("Abort.")
time.sleep(1)
sys.exit(0)


def clean(path, backup_path):
"""clean 清理

Args:
path (str): 清理目标目录
backup_path (str): 备份目录
"""
i = 0
# 正则表达式
pattern1 = r"^\._\S+"
pattern2 = r"^\.DS_Store$"
print("Selected path: " + path)
# 递归查找目录下文件
for dirpath, dirs, files in os.walk(path):
for dir in dirs:
if dir.lower() in ['.fseventsd', '.spotlight-v100', '.trashes']:
i += 1
filePath = os.path.join(dirpath, dir)
print("* {} Found... {}".format(i, filePath))
if (os.path.exists(backup_path + os.path.sep + dir)):
try:
os.rename(backup_path + os.path.sep + dir,
backup_path + os.path.sep + dir + str(i))
except IOError as err:
print("不能重命名" + backup_path + os.path.sep + dir, err)
try:
shutil.move(filePath, backup_path)
except IOError as err:
print("不能移动" + filePath, err)
else:
try:
shutil.move(filePath, backup_path)
except IOError as err:
print("不能移动" + filePath, err)
for file in files:
matchObj1 = re.match(pattern1, file, re.I)
matchObj2 = re.match(pattern2, file, re.I)
if matchObj1 or matchObj2:
i += 1
filePath = os.path.join(dirpath, file)
print("* {} Found... {}".format(i, filePath))
if (os.path.exists(backup_path + os.path.sep + file)):
try:
os.rename(backup_path + os.path.sep + file,
backup_path + os.path.sep + file + str(i))
except IOError as err:
print("不能重命名" + backup_path + os.path.sep + file, err)
try:
shutil.move(filePath, backup_path)
except IOError as err:
print("不能移动" + filePath, err)
else:
try:
shutil.move(filePath, backup_path)
except IOError as err:
print("不能移动" + filePath, err)
if (i == 0):
print("\n*No trash file found!")
print("Abort.")
time.sleep(1)
shutil.rmtree(backup_path)
else:
if OS_NAME == 'nt':
os.system("explorer " + backup_path)
if OS_NAME == 'posix':
os.system("ls -a " + backup_path)
delAll(backup_path)


def selectPath() -> str:
print("====================", "OS:", OS_NAME)
print("请输入需要处理的目录")
print("输入 `this` 处理当前目录 ")
try:
src = input("=> ")
except KeyboardInterrupt:
print("Abort.")
sys.exit(0)
if src.lower() == "this" or os.path.exists(src):
return src
else:
raise FileNotFoundError(src)


def mkDir(path):
"""mkDir 创建备份文件夹

Args:
path (str): 文件夹路径

Raises:
FileNotFoundError: 无法创建文件夹
"""
if not (os.path.exists(path + os.path.sep + "MAC-TMP-FILES")):
os.mkdir(path + os.path.sep + "MAC-TMP-FILES")
time.sleep(0.5)
if (os.path.exists(path + os.path.sep + "MAC-TMP-FILES")):
print("备份文件夹创建成功..." + path + os.path.sep + "MAC-TMP-FILES")
else:
raise FileNotFoundError(path + os.path.sep + "MAC-TMP-FILES")


def main():
"""main 主函数,方便外部调用
"""
# 获取本文件所在目录
currentPath = os.getcwd() + os.path.sep
path = selectPath()
print("备份文件夹目录:(不要在处理的目录下!)")
try:
backup_path = input("=> ")
except KeyboardInterrupt:
print("Abort.")
sys.exit(0)
mkDir(backup_path)
backup_path = backup_path + os.path.sep + "MAC-TMP-FILES"
if (path.lower() == "this"):
clean(currentPath, backup_path)
else:
clean(path, backup_path)


OS_NAME = ""

if __name__ == "__main__":
OS_NAME = os.name
if OS_NAME == 'nt':
os.system('cls')
elif OS_NAME == 'posix':
os.system('clear')
main()

Github链接

打赏
  • 版权声明: 本博客采用 Apache License 2.0 许可协议。
    转载请注明出处: https://ryzenx.com/2020/03/macOS-trashfile-cleaner/

谢谢你的喜欢~

支付宝
微信