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