Удалите все файлы/каталоги кроме двух определенных каталогов

let str = "/something / test"
str = str.replace(/\//g, '_')
console.log(str)

5
задан phuzion 14 May 2009 в 09:25
поделиться

9 ответов

find -prune приходит на ум, но сложно заставить его работать для определенных путей ( icecream / cupcake / ), а не в конкретных каталогах ( cupcake / ).

Лично я бы просто использовал cpio и жестко связал (чтобы не копировать их) файлы в каталоги, которые вы хотите сохранить, в новое дерево, а затем удалите старое:

find test -path 'test/icecream/cupcake/*' -o -path 'test/mtndew/livewire/*' | cpio -padluv test-keep
rm -rf test

Это также сохранит существующую структуру каталогов для каталогов, которые вы собираетесь сохранить.

3
ответ дан 18 December 2019 в 09:10
поделиться

Эта команда оставит только нужные файлы в их исходных каталогах:

find test \( ! -path "test/mtndew/livewire/*" ! -path "test/icecream/cupcake/*" \) -delete

Нет необходимости в cpio. Он работает в Ubuntu, Debian 5 и Mac OS X.

В Linux он сообщает, что не может удалить непустые каталоги, что и является желаемым результатом. В Mac OS X он спокойно поступает правильно.

6
ответ дан 18 December 2019 в 09:10
поделиться

используйте find .

Ваша команда будет выглядеть примерно так:

find $directory \( -prune 'some pattern' \) -delete
0
ответ дан 18 December 2019 в 09:10
поделиться

У меня это работает с 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 
0
ответ дан 18 December 2019 в 09:10
поделиться

Как и другие, я использовал 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, распечатать список, чтобы увидеть, как он выглядит, применить следующий фильтр, посмотреть, удалял ли он слишком много или слишком мало и т. Д.

0
ответ дан 18 December 2019 в 09:10
поделиться

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')
3
ответ дан 18 December 2019 в 09:10
поделиться

Вы могли бы сделать что-нибудь на основе функции 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))

... просто добавьте что-нибудь, чтобы игнорировать интересующие вас пути.

2
ответ дан 18 December 2019 в 09:10
поделиться

Переместите то, что хотите сохранить, в другое место, затем удалите то, что осталось.

2
ответ дан 18 December 2019 в 09:10
поделиться

Единственный способ решения проблемы:

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

Фактически не тестировалось, если оно ломается, вы можете оставить обе части.

Редактировать: Как указывает Деннис, это не только две части, на которые он разбивается :-) исправил опечатки во втором примере и удалил первую

0
ответ дан 18 December 2019 в 09:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: