After moving all my music with EasyTag creator I was left with a directory structure with tons of directories which had no music (but maybe .cue or .m3u files or maybe even subdirs). If you run this on the root of your music folder, it will try to fix it!
#!/usr/bin/python
import re, os, sys, shutil
"""Script to delete all subfolders of a folder that do not
contain music (at any subdirectory level).
- Alex Knaust 10/25/2012
"""
musicRegex = re.compile(r"\.(flac|mp3|ogg|mp4|aac|alac|ape|wav)", re.IGNORECASE)
def music_match(fname):
"""Determine if a file is music (according to musicRegex)"""
return musicRegex.match(os.path.splitext(fname)[-1])
def has_any_music(files):
"""Check if a list of filenames contains any music files (via music_match)"""
for f in files:
if music_match(f):
return True
return False
def get_nomusic_directories(srcdir):
"""Returns a list of subdirectories with no music in them" (at any level)"""
results = []
for f in os.listdir(srcdir):
f = os.path.join(srcdir, f)
if os.path.isdir(f):
hasmusic = False
for dirpath, dirnames, filenames in os.walk(f):
if has_any_music(filenames):
hasmusic = True
break
if not hasmusic:
results.append(f)
return results
def main():
if len(sys.argv) != 2:
print('Pass the directory to be cleaned')
exit(1)
nomusic = get_nomusic_directories(sys.argv[1])
ans = raw_input('Will delete %d Directories OK? y/n : ' % len(nomusic))
if not ans.lower()[0] == 'y':
print 'OK! exiting...'
exit(0)
for directory in nomusic:
def printfails(func, path, errinf):
print('Failed to remove "%s"' % path)
shutil.rmtree(directory, onerror=printfails)
if __name__ == '__main__':
main()