Как и другие, я использовал os.walk и os.path.join для создания списка файлов, которые нужно удалить, с помощью fnmatch.fnmatch для выбора файлов, которые должны быть включены или исключены:
#-------------------------------#
# make list of files to display #
#-------------------------------#
displayList = []
for imageDir in args :
for root,dirs,files in os.walk(imageDir) :
for filename in files :
pathname = os.path.join( root, filename )
if fnmatch.fnmatch( pathname, options.includePattern ) :
displayList.append( pathname )
#----# now filter out excluded patterns #----#
try :
if len(options.excludePattern) > 0 :
for pattern in options.excludePattern :
displayList = [pathname for pathname in displayList if not fnmatch.fnmatch( pathname, pattern ) ]
except ( AttributeError, TypeError ) :
pass
Если fnmatch недостаточно, вы можете использовать модуль re для тестирования шаблонов.
Здесь я создал список файлов, прежде чем что-то с ним делать, но вы можете обрабатывать файлы по мере их создания.
Блок try / исключением ... существует в том случае, если в моем экземпляре класса параметров отсутствует шаблон исключения или если он вызывает исключение в fnmatch, потому что это неправильный тип.
Ограничением этого метода является то, что сначала включает файлов, соответствующих шаблону, , затем исключает . Если вам нужна большая гибкость, чем эта (включая соответствующий шаблон a, но не шаблон b, если не шаблон c ...), тогда приведенный выше фрагмент не до него. Фактически, работая с этим упражнением, вы начинаете понимать, почему синтаксис команды find такой, какой он есть. Кажется неуклюжим, но на самом деле это именно тот способ.
Но если вы генерируете список, вы можете фильтровать его в соответствии с любыми правилами включения / исключения, которые вам нужны.
Одна приятная вещь при создании списка - вы можете проверить его, прежде чем продолжить удаление. Это своего рода опция --dryrun. Вы можете сделать это в интерактивном режиме в интерпретаторе python, распечатать список, чтобы посмотреть, как он выглядит, применить следующий фильтр, посмотреть, удалил ли он слишком много или слишком мало и т. Д.