Я переименовал некоторые файлы в довольно большом проекте и хочу удалить файлы .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, он удалит все.