2013-09-15 4 views
0

Я использую OSX и хотел бы использовать команду «найти» Unix, чтобы найти все экземпляры следующих и удалить их.OSX найти конкретный путь/комбинацию и удалить

/Library/Application Support/Adobe/Acrobat/10,0

Однако, иногда это приставкой:

/Volumes/Главная/Библиотека Поддержка/Application/Adobe/Acrobat/10.0

А иногда даже:

Поддержка

/Volumes/Резервное копирование/_rsync-дата/Library/Application/Adobe/Acrobat/10,0

и так далее ... есть много других экзамен на разных уровнях файловой системы.

Поэтому я хочу, чтобы иметь возможность найти в любом каталоге, где существует комбинация «/ Library/Application Support/Adobe/Acrobat/10.0» и удаляет ее.

Да, я могу использовать следующее, чтобы удалить любой каталог с именем «10,0»

find . -type d -name "10.0" -exec rm -rf {} \; 

Но я хотел бы этот поиск, чтобы быть более точным, так что я не удаляя папку с таким именем, но только папки с префиксом "/ Библиотека/Поддержка приложений/Adobe/Acrobat/10.0"

Ваши предложения наиболее ценятся!

Dan

ответ

1

path предикат не является стандартным, но он определенно существует на версии BSD из find на OS X.

find . -path '*/Library/Application Support/Adobe/Acrobat/10.0' -type d -execdir rm -r {} + 

выше команда будет соответствовать ничего от тока каталог, который соответствует этому пути выражения , заканчивающегося в «10.0», и это сама директория.

+0

это бомба, абсолютно идеальная и элегантная. Я не знал о аргументе «путь». Бесценный. Спасибо!!! – Dan

+0

просто любопытно, можно ли использовать -delete вместо '-execdir rm -r {} +' ?? – Dan

+0

@ Dan Я сомневаюсь. В manpage говорится, что * [- delete] не будет пытаться удалить имя файла с символом ''/'' в своем пути по отношению к '.. '' По соображениям безопасности. * – kojiro

-2
find . -type d -name "10.0" -print0 | 
grep "Library/Application Support/Adobe/Acrobat/10.0$" | xargs -0 rm -rf 
+0

@WarrenYoung и молчаливый избиратель: не видели этого ... Изменен мой ответ. Это должно сработать. – iamauser

+0

Нет. См. Пункт 2 в своем ответе за «почему». –

+0

Это прекрасно работает для меня, поскольку у меня есть это здесь. – iamauser

0
$ find/-name '10.0' 2> /dev/null | 
    grep 'Library/Application Support/Adobe/Acrobat/10.0$' | 
    tr '\n' '\0' | 
    xargs -0 rm -rf 

Вопросы для обсуждения:

  1. 2> /dev/null бит просто подавляет шум от find(1) благодаря ходьбе через файловую систему вы не имеете полный доступ, как это будет в случае, если вы не используете это как корень.

  2. Я использовал tr(1) после grep(1) вместо find -print0 потому grep(1) хорошо не работает со встроенными нулям, так что преобразование должно произойти после того, как grep отфильтровывает некорректные частичные совпадения.

  3. Не следите за этой командой как есть. Если вы удалите бит rm -rf в конце, xargs(1) просто распечатает пути, на которые он предлагает действовать. Убедитесь, что он будет делать то, что вы хотите, прежде чем выдавать команду, как я ее дал.

Смежные вопросы