Как удалить все .pyc файлы из проекта?

Я переименовал некоторые файлы в довольно большом проекте и хочу удалить файлы .pyc, которые они оставили. Я попробовал bash script:

 rm -r *.pyc

Но это не рекурсия через папки, как я думал. Что я делаю неправильно?

Ответ 1

find . -name "*.pyc" -exec rm -f {} \;

Ответ 2

find . -name '*.pyc' -delete

Несомненно, самый простой.

Ответ 3

В текущей версии debian у вас есть pyclean script, который находится в пакете python-minimal.

Использование прост:

pyclean .

Ответ 4

Добавьте к своему ~/.bashrc:

pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}

Это удаляет все файлы .pyc и .pyo и каталоги __pycache__. Это также очень быстро.

Использование просто:

$ cd /path/to/directory
$ pyclean

Ответ 5

Если вы используете bash >= 4.0 (или zsh)

rm **/*.pyc

Обратите внимание, что */*.pyc выбирает все .pyc файлы в непосредственных подкаталогах первого уровня, а **/*.pyc рекурсивно сканирует все дерево каталогов. В качестве примера foo/bar/qux.pyc будет удален rm **/*.pyc, но не */*.pyc.

Параметры оболочки globstar должны быть включены. Чтобы включить globstar:

shopt -s globstar

и проверить его статус:

shopt globstar

Ответ 6

Я использовал для этого псевдоним:

$ which pycclean

pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'

Ответ 7

find . -name '*.pyc' -print0 | xargs -0 rm

Найти рекурсивно ищет *.pyc файлы. Xargs принимает этот список имен и отправляет его в rm. Параметры -print0 и -0 указывают двум командам разделять имена файлов с нулевыми символами. Это позволяет корректно работать с именами файлов, содержащими пробелы, и даже с именем файла, содержащим новую строку.

Решение с -exec работает, но оно создает новую копию rm для каждого файла. В медленной системе или с большим количеством файлов это займет слишком много времени.

Вы также можете добавить еще пару аргументов:

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

iname добавляет нечувствительность к регистру, например *.PYC. No-run-if-empty не дает вам получить ошибку из rm, если у вас нет таких файлов.

Ответ 8

Для пользователей Windows:

del /S *.pyc

Ответ 9

$ find . -name '*.pyc' -delete

Это быстрее, чем

$ find . -name "*.pyc" -exec rm -rf {} \;

Ответ 10

Кроме того, люди обычно хотят рекурсивно удалить все файлы *.pyc, *.pyo __pycache__ и __pycache__ в текущем каталоге.

Команда:

find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf

Ответ 11

Просто чтобы добавить другой вариант в микс, вы также можете использовать backquotes следующим образом:

rm `find . -name *.pyc`

Ответ 13

полная рекурсивная

ll **/**/*.pyc
rm **/**/*.pyc

Ответ 14

Первый запуск:

find . -type f -name "*.py[c|o]" -exec rm -f {} +

Затем добавьте:

export PYTHONDONTWRITEBYTECODE=1

To ~/.profile

Ответ 15

если вы больше не хотите .pyc, вы можете использовать эту строку в терминале:

export PYTHONDONTWRITEBYTECODE=1

если вы передумаете:

unset PYTHONDONTWRITEBYTECODE

Ответ 16

rm -r рекурсирует в директории, но только каталоги, которые вы передаете rm. Он также удалит эти каталоги. Одним из решений является:

for i in $( find . -name *.pyc )
do
  rm $i
done

find найдет все *.pyc файлы рекурсивно в текущем каталоге, а цикл for будет перебирать список найденных файлов, удаляя каждый из них.

Ответ 17

find . -name "*.pyc"|xargs rm -rf

Ответ 18

Вы можете запустить find. -name "*.pyc" -type f -delete find. -name "*.pyc" -type f -delete.

Но используйте его с осторожностью. Беги сначала find. -name "*.pyc" -type f find. -name "*.pyc" -type f чтобы точно узнать, какие файлы вы будете удалять.

Кроме того, убедитесь, что -delete является последним аргументом в вашей команде. Если вы поставите его перед аргументом -name *.pyc, он удалит все.