Я хочу рекурсивно удалить все файлы .pyc и .pyo, но исключить определенный каталог. Я просто столкнулся с некоторым ограничением, когда find не может удалить при игнорировании. Я попытался передать результат в xargs rm но это тоже не удалось .

find . -not \( -path somedir -prune \) -name '*.py[co]' -exec rm '{}' \;

с ошибкой:

find: The -delete action atomatically turns on -depth, but -prune does nothing when -depth is in effect.  If you want to carry on anyway, just explicitly use the -depth option.

Это также не удается:

find . -type f -not -path 'somdir/*' -name '*.py[co]' -print0 | xargs -0 rm

Версии:

  • ОС: Ubuntu 14.04 LTS
  • найти версию 4.4.2

4 ответа4

0

Если "somedir" не так много, вы можете временно удалить разрешение на запись и просто -name '*.py[co]' -delete все.

Не забудьте добавить разрешение на запись обратно в "somedir".

Br,

0

Производить фильтрацию с помощью awk и использовать xargs для запуска команды?

find . -type f -name '*.py[co]' -print0 \
    | awk -vRS='\0' '!/^.\/somedir\//' \
    | xargs -0 rm

параметры awk :

  • -vRS='\0' устанавливает RS (разделитель записей) в nul (\0) вместо значения по умолчанию (\n)
  • ! отрицает регулярное выражение
  • ^./somedir/ любая запись, начинающаяся с ./somedir/
    • не забывайте избегать косых черт регулярного выражения / пути - необработанное регулярное выражение становится: ^.\/somedir\/
0

Вы , кажется, путаете , как -not и -prune взаимодействует. Обычная вещь - «найди это и подрежь это, или это и подрежь это, или это и на самом деле что-то с этим сделай».

find . -path somedir -prune -o -name '*.py[co]' -delete

Я заменил -exec ... на -delete который запускает встроенное действие удаления без внешних процессов. Если вы хотите в какой-то момент -exec что-то еще, возможно, используйте -exec command {} + вместо команды -exec command {} \; (и обратите внимание, что одиночные кавычки вокруг {} не очень полезны; оболочка обработает и удалит их до find как поиск будет запущен в любом случае).

0

Кажется, мне нужно было явно указать префикс . перед каталогом. Я не уверен, что полностью понимаю почему, но для кого-либо еще в этой ситуации:

Сбой:

find . -type f -not -path 'somdir/*' -name '*.py[co]' -print0 | xargs -0 rm

Работает:

find . -type f -not -path './somdir/*' -name '*.py[co]' -print0 | xargs -0 rm

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .