我正在编写另一个 python 清除脚本。这是用大量的 find -delete 替换非常旧的 bash 脚本,这需要 9 小时才能清除我们的视频后端。
我知道在堆栈上或在 google 中有很多这样的代码,但问题是我还有一些限制,这让我不得不编写我发现糟糕/低效的代码。
考虑以下目录结构:
/data/channel1/video_800/0001/somefile_800_001.ts
/data/channel1/video_800/0001/somefile_800_002.ts
/data/channel1/video_800/0002/somediffile_800_001.ts
/data/channel1/video_800/0002/somediffile_800_002.ts
/data /channel1/video_800.m3u8
/data/channel1/video_900/0001/someotherfile_900_001.ts
/data/channel1/video_900/0002/afile_900_001.ts
/data/channel1/video_900/0003/bfile_900_001.ts
/data/channel1/video_900/0003 /cfile_900_001.ts
/data/channel1/video_900.m3u8/data/channel2/video_800/0001/againsomefile_800_001.ts
/data/channel2/video_800/0001/againsomefile_800_001.ts
/data/channel2/video_800.m3u8/data/sport_channel/video_1000/0001/somefile.ts /data/sport_channel/video_1000/0001/somefile2.ts
我感兴趣的第一件事是频道名称,因为频道* 有一个规则,运动* 有一个规则。
第二件事是等于比特率的视频目录的结尾...... 800、900、1000,因为它们可能有不同的保留天数。
最后,我将检查所有内容并根据比特率和扩展删除文件。
波纹管代码有效,但过于复杂,我敢肯定不是很pythonic。由于在这种情况下我最关心的是性能,我相信有一种更有效的方法可以做到这一点。在 for 循环中堆叠 for 循环不仅是糟糕的设计,而且在我的pymode 中, 'find_files' 太复杂了 [mccabe]。
** 将删除函数从代码示例中删除,但这只是一个简单的尝试:除了使用 os.rmdir 和 os.remove
我愿意接受所有改进我的代码的建议。
谢谢!
#!/usr/bin/python
import os
import time
import fnmatch
path = '/data'
debits_short = ['200', '700', '1000', '1300', '2500']
debits_long = ['400', '1800']
def find_files(chan_name, debits, duration):
time_in_secs = time.time() - (duration * 24 * 60 * 60)
# List channel
for channel in os.listdir(path):
# Match category channels
if fnmatch.fnmatch(channel, chan_name):
# Go through bitrates
for debit in debits:
# Channel path now the default search path
channel_path = path + channel
# Walk through channel path to match bitrate files
for root, dirs, files in os.walk(channel_path, topdown=False):
for filename in files:
# Remove files that contain _bitrate_ and end with ts
if '_' + debit + '_' in filename:
if filename.endswith('.ts'):
if os.path.isfile(os.path.join(root, filename)):
if os.stat(os.path.join(root, filename)).st_mtime <= time_in_secs:
remove(os.path.join(root, filename))
# Remove playlist files that contain bitrate.m3u8
if filename.endswith(debit + '.m3u8'):
if os.path.isfile(os.path.join(root, filename)):
if os.stat(os.path.join(root, filename)).st_mtime <= time_in_secs:
remove(os.path.join(root, filename))
# Remove empty dirs
for dir in dirs:
if not os.listdir(os.path.join(root, dir)):
remove(os.path.join(root, dir))
find_files('channel*', debits_long, 3)
find_files('sport*', debits_short, 7)