Як видалити всі .pyc файли з проекту?


677

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

 rm -r *.pyc

Але це не повторюється через папки, як я думав, що це буде. Що я роблю неправильно?


11
Це не працює, оскільки в UNIX глобуси розширюються оболонкою, а не запущеною програмою. Якщо у поточному каталозі ви є a.pyc та b.pyc, а також каталоги foo та bar, rmбуде викликано аргументи [-r, a.pyc, b.pyc].
ефемія

1
якщо ви **/*.pycтурбуєтесь про те, щоб надсилати свій код іншим людям, ви можете просто додати його до .gitignore, тоді вам більше не доведеться турбуватися про це
bubakazouba

Відповіді:


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

385
У пошуку є вбудована акція "видалення", тож ви можете зробити простоfind . -name \*.pyc -delete
Крістофер

51
Найголовніше, якщо це машина для розробників, ви можете встановити PYTHONDONTWRITEBYTECODE = Істинно, і вам більше ніколи цього не потрібно буде робити. Дивіться: ця відповідь .
mlissner

5
Ви не цитуєте {}. Що станеться, якщо випадково розділити слово та видалити проміжний шлях, який, начебто, називається фрагментом шляху, який ви знайшли?
Robottinosino

20
-deleteне входить до специфікації POSIX і не гарантується існуванням у всіх реалізаціях find.
чепнер

7
Якщо ви боїтесь - що може бути добре - зробіть перший пропуск за допомогою -exec echo {}, або - якщо ви дуже боїтеся - використовуйте rm -i {}, який запитує вас кожен раз, або rm - v {}, щоб ви побачили, що ви видаляєте.
jeanM

1021

find . -name '*.pyc' -delete

Безумовно, найпростіший.


21
Якщо ваша версія findпідтримує -delete; він не є частиною стандарту POSIX.
чепнер

4
При цьому ігноруються .pyo файли та __pycache__каталоги. Дивіться мою відповідь.
Вільфред Х'юз

Я використовував код з прийнятого відповіді , і вона працювала, але ці команди коротше і просто
Dap

3
-name '*.py?'включити.pyo, .pyc,...
cdosborn

2
Зробити впевненим - видалення - це останнє в команді. Я випадково поставив -delete відразу після знахідки. Це видалило все!
thinkanotherone

85

У поточній версії debian у вас є pycleanсценарій, який знаходиться в python-minimalпакеті.

Використання просте:

pyclean .

34
Варто зазначити, що видається, що pyclean видаляє лише файли .pyc, для яких є відповідний .py-файл (принаймні в моїй системі - ubuntu 12.10.) Це означає, що це не дуже корисно в ситуаціях, коли вихідний файл був видалений і ви хочете для очищення залишків .pyc файлів.
tigerFinch

@holms pyclean(і зараз py3clean) походять з пакету Debian і, отже, не знаходяться в RHEL.
дуозмо

83

Додати до свого ~/.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часто подаватиме попередження про пропущений шлях, тому що, мабуть, вміст буде додано до черги до видалення папки. 2>/dev/nullповинні це виправити.
Божевільний фізик

53

Якщо ви використовуєте bash> = 4.0 (або zsh)

rm **/*.pyc

Зауважте, що */*.pycвибирає всі .pycфайли в безпосередніх підкаталогах першого рівня, **/*.pycрекурсивно сканує все дерево каталогів. Наприклад, foo/bar/qux.pycбуде видалено, rm **/*.pycале не користувачем */*.pyc.

Параметри оболонки globstar повинні бути включені. Щоб увімкнути globstar:

shopt -s globstar

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

shopt globstar

1
Яка різниця у запуску rm **/*.pycпроти rm */*.pyc? (Останній, здавалося, працює на мене локально.)
Тейлор Едмістон,

1
@TaylorEdmiston rm */*.pycвидалить усі .pycфайли з усіх підкаталогів глибини 1. rm **/*.pycвидалить усі .pycфайли з усіх підкаталогів глибиною 0+
Адам Стюарт

@AdamStewart Дякуємо, що додали це. Для інших, що стикаються з цією темою, проблема, з якою я стикався, полягала в тому, що баш Apple, що постачається з OS X, не включає globstar (так **діє, *коли замість запуску та запуску shopt globstarвидає помилку).
Тейлор Едмістон

30

Для цього я використовував псевдонім:

$ which pycclean

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

12
У поточному debian це pyclean.
jb.

7
Це не добре справляється з пробілом у назви файлів. Вам слід використовувати find -print0і xargs -0замість цього.
r3m0t

2
Чому ви хочете мати код python з пробілами у назвах файлів / папок? Це синтаксично законно?
coredumperror

@CoreDumpError, так, насправді в Windows Python встановлюється каталог з пробілами ("Файли програм").
Пол Дрейпер

Інтерпретатор python може встановити там за замовчуванням, але навряд чи вдало поставити свій код . Крім того, ви, звичайно, не хотіли б, щоб папка Program Files була частиною вашої структури пакету, саме тому я насторожено ставився до синтаксису.
coredumperror

24

Для користувачів Windows:

del /S *.pyc

Якщо помістити це в пакетний сценарій, це дуже просто. Дякую.
Нік Готч

А якщо ви перебуваєте на Powershell, це можна використовувати з "cmd" -> командою Run -> "exit".
np8

18
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. Не запущений-якщо-порожній не дозволяє отримати помилку від rm, якщо у вас немає таких файлів.


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

Це швидше, ніж

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

11

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

Команда:

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

Це гарна відповідь, але звичайне рішення Python було б кросплатформенним, а отже, і кращим. Хоча, особисто я не дбаю про Windows , ймовірно , половина життя населення Python на Windows - і find, grepі друзі не працюють там.
Петріно

Вони роблять, якщо встановити інструментарій. Я рекомендую кожному користувачу Windows CLI зробити це так, щоб полегшити перехресну
співпрацю

8

Для того, щоб кинути ще один варіант у суміш, ви також можете використовувати такі зворотні цитати:

rm `find . -name *.pyc`

5
Це має незначний недолік, якщо збіг буде занадто багато, тому що буде занадто багато аргументів для передачі rm.
чепнер


7

повний рекурсивний

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

Цікаво, як це порівнюється з відповідями Енді та Білла?
Остін Генлі

3
Один набір **є зайвим, і, як у d0kвідповіді у відповіді, ви повинні увімкнути globstar у bash 4+, щоб це працювало за призначенням. тобто зробіть це shopt -s globstarчи є в одному зі своїх джерел. файли.
Відновіть Моніку. Будь ласка,

1
Також llзазвичай псевдонім щось подібне ls -l, але насправді це не команда чи портативний. Отже, щоб рекурсивно перелічити всі .pycфайли ., замість цього вам слід зробити щось на кшталт echo **/*.pycувімкненого globstar
Відновіть Моніку. Будь ласка,

3

Перший запуск:

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

Потім додайте:

export PYTHONDONTWRITEBYTECODE=1

To ~ / .profile


3

якщо ви більше не хочете .pyc, ви можете використовувати цей єдиний рядок у терміналі:

export PYTHONDONTWRITEBYTECODE=1

якщо ви передумаєте:

unset PYTHONDONTWRITEBYTECODE

2

rm -rповторюється в каталоги, але тільки ті каталоги, які ви надаєте rm. Він також видалить ці каталоги. Одне рішення:

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

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


Цей працює, хоча я мушу помістити його у .sh файл та запустити його (що добре, я використовую цю команду не один раз)
Teifion

Я вважаю, що розміщуючи все це на одній лінії, розділеній на ';', слід дозволити вам запустити це в оболонці. Але коли я набираю це в баші, Баш чекає, коли "зроблено" в кінці чого-небудь виконати ...
Кріс Лутц,

Це жахливий антипатерн (і дуже поширений теж, я б хотів, щоб він зник): він розривається з назви файлів, що містять пробіли або глобальні символи. І він пропускає точку findсвого -execприсудка: find . -name '*.pyc' -exec rm {} +(приємніше, коротше, безпечніше, міцніше, ефективніше).
gniourf_gniourf


1

Можна бігати find . -name "*.pyc" -type f -delete.

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

Крім того, переконайтеся, що -delete є останнім аргументом у вашій команді. Якщо ви поставите його перед аргументом -name * .pyc, він видалить усе.


1

Якщо ви хочете видалити всі .pyc файли з папки проекту.

По-перше, у вас є

cd <path/to/the/folder>

потім знайдіть увесь файл .pyc та видаліть.

find . -name \*.pyc -delete
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.