let str = "/something / test"
str = str.replace(/\//g, '_')
console.log(str)
find
-prune
приходит на ум, но сложно заставить его работать для определенных путей ( icecream / cupcake /
), а не в конкретных каталогах ( cupcake /
).
Лично я бы просто использовал cpio
и жестко связал (чтобы не копировать их) файлы в каталоги, которые вы хотите сохранить, в новое дерево, а затем удалите старое:
find test -path 'test/icecream/cupcake/*' -o -path 'test/mtndew/livewire/*' | cpio -padluv test-keep
rm -rf test
Это также сохранит существующую структуру каталогов для каталогов, которые вы собираетесь сохранить.
Эта команда оставит только нужные файлы в их исходных каталогах:
find test \( ! -path "test/mtndew/livewire/*" ! -path "test/icecream/cupcake/*" \) -delete
Нет необходимости в cpio. Он работает в Ubuntu, Debian 5 и Mac OS X.
В Linux он сообщает, что не может удалить непустые каталоги, что и является желаемым результатом. В Mac OS X он спокойно поступает правильно.
используйте find
.
Ваша команда будет выглядеть примерно так:
find $directory \( -prune 'some pattern' \) -delete
У меня это работает с find, используя два шага: сначала удалите разрешенные файлы, а затем их пустые каталоги!
find -x -E ~/Desktop/test -not \( -type d -regex '.*/(cupcake|livewire)/*.*' -prune \) -print0 | xargs -0 ls -1 -dG
# delete the files first
# Mac OS X 10.4
find -x -E ~/Desktop/test -not \( -type d -regex '.*/(cupcake|livewire)/*.*' -prune \) -type f -exec /bin/rm -fv '{}' \;
# Mac OS X 10.5
find -x -E ~/Desktop/test -not \( -type d -regex '.*/(cupcake|livewire)/*.*' -prune \) -type f -exec /bin/rm -fv '{}' +
# delete empty directories
find -x ~/Desktop/test -type d -empty -delete
Как и другие, я использовал 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 / except ... присутствует в случае, если у моего экземпляра класса параметров нет шаблона исключения, или если он вызывает исключение в fnmatch, потому что это неправильный тип.
Ограничение этого метода состоит в том, что сначала включает файлов, соответствующих шаблону, затем исключает . Если вам нужна большая гибкость (включите соответствующий шаблон a, но не шаблон b, если только шаблон c ...), то приведенный выше фрагмент не подходит. Фактически, работая с этим упражнением, вы начинаете понимать, почему синтаксис команды find такой, какой он есть. Кажется неуклюжим, но на самом деле это именно тот способ, которым это нужно сделать.
Но если вы создаете список, вы можете фильтровать его в соответствии с любыми нужными вам правилами включения / исключения.
При создании списка есть одна хорошая вещь: вы можете проверить его, прежде чем продолжить удаление. Это что-то вроде опции --dryrun. Вы можете сделать это в интерактивном режиме в интерпретаторе python, распечатать список, чтобы увидеть, как он выглядит, применить следующий фильтр, посмотреть, удалял ли он слишком много или слишком мало и т. Д.
вы можете отфильтровать его по любым нужным вам правилам включения / исключения.При создании списка есть одна хорошая вещь: вы можете проверить его, прежде чем продолжить удаление. Это что-то вроде опции --dryrun. Вы можете сделать это в интерактивном режиме в интерпретаторе python, распечатать список, чтобы увидеть, как он выглядит, применить следующий фильтр, посмотреть, удалял ли он слишком много или слишком мало и т. Д.
вы можете отфильтровать его по любым нужным вам правилам включения / исключения.При создании списка есть одна хорошая вещь: вы можете проверить его, прежде чем продолжить удаление. Это что-то вроде опции --dryrun. Вы можете сделать это в интерактивном режиме в интерпретаторе python, распечатать список, чтобы увидеть, как он выглядит, применить следующий фильтр, посмотреть, удалял ли он слишком много или слишком мало и т. Д.
Everything "except" is why we have if-statements; and why os.walk's list of directories is a mutable list.
for path, dirs, files in os.walk( 'root' ):
if 'coke' in dirs:
dirs.remove('coke')
dirs.remove('pepsi')
Вы могли бы сделать что-нибудь на основе функции os.walk Python :
import os
for root, dirs, files in os.walk(top, topdown=False):
for name in files:
os.remove(os.path.join(root, name))
for name in dirs:
os.rmdir(os.path.join(root, name))
... просто добавьте что-нибудь, чтобы игнорировать интересующие вас пути.
Переместите то, что хотите сохранить, в другое место, затем удалите то, что осталось.
Единственный способ решения проблемы:
find. | grep -v "тест / мороженое / кекс /" | grep -v "test / mtndew / livewire /" | xargs rm -r
Удалено, поскольку оно не работает
. Это может вызвать проблемы, если имена файлов содержат пробелы, и в них может храниться больше файлов, чем вы хотите, чтобы были другие деревья, соответствующие шаблону.
Несколько лучшее решение:
find . |sed "s/.*/rm '&'/"|grep -v "rm './test/icecream/cupcake/"| grep -v "rm './test/mtndew/livewire/"|sh
Фактически не тестировалось, если оно ломается, вы можете оставить обе части.
Редактировать: Как указывает Деннис, это не только две части, на которые он разбивается :-) исправил опечатки во втором примере и удалил первую