Я переименовал некоторые файлы в довольно большом проекте и хочу удалить файлы .pyc, которые они оставили. Я попробовал bash script:
 rm -r *.pyc
Но это не рекурсия через папки, как я думал. Что я делаю неправильно?
Я переименовал некоторые файлы в довольно большом проекте и хочу удалить файлы .pyc, которые они оставили. Я попробовал bash script:
 rm -r *.pyc
Но это не рекурсия через папки, как я думал. Что я делаю неправильно?
find . -name "*.pyc" -exec rm -f {} \;
 find . -name '*.pyc' -delete
Несомненно, самый простой.
В текущей версии debian у вас есть pyclean script, который находится в пакете python-minimal.
Использование прост:
pyclean .
Добавьте к своему ~/.bashrc:
pyclean () {
        find . -type f -name "*.py[co]" -delete
        find . -type d -name "__pycache__" -delete
}
Это удаляет все файлы .pyc и .pyo и каталоги __pycache__. Это также очень быстро.
Использование просто:
$ cd /path/to/directory
$ pyclean
Если вы используете bash >= 4.0 (или zsh)
rm **/*.pyc
Обратите внимание, что */*.pyc выбирает все .pyc файлы в непосредственных подкаталогах первого уровня, а **/*.pyc рекурсивно сканирует все дерево каталогов. В качестве примера foo/bar/qux.pyc будет удален rm **/*.pyc, но не */*.pyc.
Параметры оболочки globstar должны быть включены. Чтобы включить globstar:
shopt -s globstar
и проверить его статус:
shopt globstar
Я использовал для этого псевдоним:
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
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, если у вас нет таких файлов.
Для пользователей Windows:
del /S *.pyc
$ find . -name '*.pyc' -delete
Это быстрее, чем
$ find . -name "*.pyc" -exec rm -rf {} \;
 Кроме того, люди обычно хотят рекурсивно удалить все файлы *.pyc, *.pyo __pycache__ и __pycache__ в текущем каталоге.
Команда:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
Просто чтобы добавить другой вариант в микс, вы также можете использовать backquotes следующим образом:
rm `find . -name *.pyc`
Примечание. Этот ответ очень специфичен для проекта Django, который уже использовал Расширение Django.
python manage.py clean_pyc
Реализация может быть просмотрена в исходном коде.
полная рекурсивная
ll **/**/*.pyc
rm **/**/*.pyc
Первый запуск:
find . -type f -name "*.py[c|o]" -exec rm -f {} +
Затем добавьте:
export PYTHONDONTWRITEBYTECODE=1
To ~/.profile
если вы больше не хотите .pyc, вы можете использовать эту строку в терминале:
export PYTHONDONTWRITEBYTECODE=1
если вы передумаете:
unset PYTHONDONTWRITEBYTECODE
 rm -r рекурсирует в директории, но только каталоги, которые вы передаете rm. Он также удалит эти каталоги. Одним из решений является:
for i in $( find . -name *.pyc )
do
  rm $i
done
 find найдет все *.pyc файлы рекурсивно в текущем каталоге, а цикл for будет перебирать список найденных файлов, удаляя каждый из них.
find . -name "*.pyc"|xargs rm -rf
 Вы можете запустить 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, он удалит все.