मैं किसी परियोजना से सभी .pyc फाइलें कैसे निकालूं?


677

मैंने कुछ फ़ाइलों को एक बड़ी परियोजना में नाम दिया है और वे .pyc फ़ाइलों को पीछे छोड़ना चाहते हैं। मैंने बैश स्क्रिप्ट की कोशिश की:

 rm -r *.pyc

लेकिन जैसा कि मैंने सोचा था कि यह फ़ोल्डर्स के माध्यम से पुनरावृत्ति नहीं करता है। मैं क्या गलत कर रहा हूं?


11
यह काम नहीं करता है क्योंकि UNIX में, ग्लब्स को शेल द्वारा विस्तारित किया जाता है, न कि प्रोग्राम द्वारा चलाया जा रहा है। यदि आपके पास वर्तमान निर्देशिका में a.pyc और b.pyc है, और निर्देशिका foo और bar, rmको तर्कों [-r, a.pyc, b.pyc] के साथ बुलाया जाएगा।
युगांतर

1
यदि आप अन्य लोगों के लिए अपने कोड को आगे बढ़ाने के बारे में चिंता कर रहे हैं, तो आप इसे केवल **/*.pyc
.gitignore में

जवाबों:


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

384
खोजें में एक अंतर्निहित "-डेलीट" क्रिया है, इसलिए आप बस कर सकते हैंfind . -name \*.pyc -delete
क्रिस्टोफर

51
सबसे महत्वपूर्ण बात, अगर यह एक देव मशीन है, तो आप PYTHONDONTWRITEBYTECODE = True सेट कर सकते हैं, और आपको इसे फिर से करने की आवश्यकता नहीं होगी। देखें: इस जवाब
मिलीलीटर

5
आप उद्धृत नहीं कर रहे हैं {}। क्या होगा यदि गलती से शब्द-विभाजन और एक मध्यवर्ती मार्ग को हटा दिया जाए, जो आपके द्वारा पाए गए पथ के टुकड़े की तरह कहा जाता है?
Robottinosino

20
-deletePOSIX विनिर्देश का हिस्सा नहीं है, और सभी कार्यान्वयन में मौजूद होने की गारंटी नहीं है find
चेपनर

7
यदि आप डरते हैं - जो कि अच्छा हो सकता है - -exec इको {} के साथ पहला पास बनाएं, या - यदि आप बहुत डरे हुए हैं - rm -i {} का उपयोग करें जो आपसे हर बार पूछते हैं या rm - v {} तो आप देखते हैं कि क्या है आप हटा दें।
jeanM

1021

find . -name '*.pyc' -delete

निश्चित रूप से सबसे सरल।


21
यदि आपके findसमर्थन का संस्करण -delete; यह POSIX मानक का हिस्सा नहीं है।
चेपनर

4
यह .pyo फ़ाइलों और __pycache__निर्देशिकाओं को अनदेखा करता है । मेरा जवाब देखिए।
विल्फ्रेड ह्यूजेस

मैं स्वीकार किए जाते हैं जवाब से कोड का इस्तेमाल किया और यह काम किया, लेकिन इन आदेशों छोटा और सरल हैं
डीएपी

3
-name '*.py?'शामिल करने के लिए.pyo, .pyc,...
cdosborn

2
MAKE SURE -delete कमांड में आखिरी चीज है। मैंने गलती से ढूंढने के बाद सीधे डाल दिया। इसने सब कुछ डिलीट कर दिया!
थिआनोथेरोन

85

डेबियन के वर्तमान संस्करण में आपके पास pycleanस्क्रिप्ट है जो python-minimalपैकेज में है।

उपयोग सरल है:

pyclean .

34
यह ध्यान देने योग्य है कि पाइक्लिन केवल .pyc फ़ाइलों को हटाने के लिए प्रकट होता है, जिसके लिए एक संबंधित .py फ़ाइल है (कम से कम मेरे सिस्टम पर - ubuntu 12.10।) इसका मतलब यह है कि यह उन स्थितियों में बहुत मददगार नहीं है, जहां एक स्रोत फ़ाइल को हटा दिया गया है और आप। बचे हुए .pyc फ़ाइलों को साफ करने के लिए।
टाइगरफिंच

@ ढोल pyclean(और अब py3clean) एक डेबियन पैकेज में उत्पन्न होते हैं, और इस तरह आरएचईएल में नहीं होते हैं।
डुओजमो

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:

shopt -s globstar

और इसकी स्थिति की जांच करने के लिए:

shopt globstar

1
rm **/*.pycबनाम चलाने में क्या अंतर है rm */*.pyc? (उत्तरार्द्ध मेरे लिए स्थानीय रूप से काम करने लगा।)
टेलर एड्मिस्टन

1
@TaylorEdmiston rm */*.pycहट जाएंगे .pycगहराई 1. के सभी उपनिर्देशिका में फ़ाइलों को rm **/*.pycहटा देगा .pycगहराई का 0+ सभी सबडायरेक्टरियों में फाइल
एडम स्टीवर्ट

@AdamStewart इसे जोड़ने के लिए धन्यवाद। इस सूत्र पर ठोकर दूसरों के लिए, इस मुद्दे को मैं अनुभव कर रहा था कि एप्पल के बैश ओएस एक्स के साथ भेज दिया नहीं है globstar में शामिल हैं (इसलिए था **रूप में कार्य करता *है जब बजाय चलाने के लिए और चल रहा है shopt globstarएक त्रुटि फेंकता है)।
टेलर एडमिस्टन

30

मैं उस के लिए एक उपनाम का उपयोग करता था:

$ which pycclean

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

12
वर्तमान डेबियन में यह पाइक्लियन है।
जेबी

7
यह फ़ाइल नाम में व्हॉट्सएप के साथ अच्छी तरह से व्यवहार नहीं करता है। आपको उपयोग करना चाहिए find -print0और xargs -0इसके बजाय।
r3m0t

2
आप फ़ाइल / फ़ोल्डर नामों में रिक्त स्थान के साथ अजगर कोड क्यों रखना चाहते हैं? क्या यह वाक्यात्मक रूप से कानूनी है?
coredumperror

@CoreDumpError, हाँ, वास्तव में विंडोज पाइथन में स्पेस ("प्रोग्राम फाइल्स") के साथ एक डाइरेक्टरी में इंस्टॉल होता है।
पॉल ड्रेपर

अजगर दुभाषिया डिफ़ॉल्ट रूप से वहां स्थापित हो सकता है, लेकिन यह आपके कोड को डालने के लिए एक अच्छी जगह है । इसके अलावा, आप निश्चित रूप से प्रोग्राम फ़ाइल फ़ोल्डर को आपके पैकेज संरचना का हिस्सा नहीं बनाना चाहेंगे, यही कारण है कि मैं सिंटैक्स के बारे में सावधान था।
coredumperror

24

विंडोज़ उपयोगकर्ताओं के लिए:

del /S *.pyc

इसे एक बैच स्क्रिप्ट में रखना चीजों को सुपर आसान बनाता है। धन्यवाद।
निक गोच

और यदि आप पॉवर्सशेल पर हैं, तो इसका उपयोग "cmd" -> रन कमांड -> "निकास" के साथ किया जा सकता है।
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

यह एक अच्छा जवाब है, लेकिन एक सादा पायथन समाधान क्रॉस-प्लेटफॉर्म होगा और इसलिए बेहतर होगा। हालांकि, व्यक्तिगत रूप से, मुझे विंडोज के बारे में परवाह नहीं है शायद पायथन की आधी आबादी विंडोज पर रहती है - और find, grepऔर दोस्त वहां काम नहीं करते हैं।
पीटरिनो

यदि आप टूलींग स्थापित करते हैं तो वे करते हैं। मैं हर विंडोज़ सीएलआई उपयोगकर्ता की सिफारिश करता हूँ ताकि क्रॉस-
कमर्स

8

बस मिक्स में एक और वेरिएंट फेंकने के लिए, आप इस तरह बैकक्वाट्स का उपयोग कर सकते हैं:

rm `find . -name *.pyc`

5
इसमें बहुत सारे मैच होने पर असफल होने की मामूली खामी है, क्योंकि पास करने के लिए बहुत सारे तर्क होंगे rm
शेपनर


7

पूर्ण पुनरावर्ती

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

दिलचस्प है, यह एंडी और बिल के उत्तरों की तुलना कैसे करता है?
ऑस्टिन हेनले

3
एक सेट **निरर्थक है, और जैसा कि d0kउत्तर में है, आपके पास इस उद्देश्य के लिए काम करने के लिए 4+ में ग्लोबस्टार सक्षम होना चाहिए। यानी एक shopt -s globstarया अपने खट्टे बैश में है। फ़ाइलें।
मोनिका प्लीज

1
इसके अलावा llआमतौर पर कुछ की तरह उपनाम है ls -l, लेकिन वास्तव में एक कमांड या पोर्टेबल नहीं है। इसलिए, सभी .pycफ़ाइलों को पुन: सूचीबद्ध करने के लिए ., आपको इसके बजाय echo **/*.pycग्लोबस्टार सक्षम के साथ कुछ करना चाहिए
मोनिका को पुनः स्थापित करें कृपया


3

अगर आप नहीं चाहते हैं। अब आप एक टर्मिनल में इस एक लाइन का उपयोग कर सकते हैं:

export PYTHONDONTWRITEBYTECODE=1

अगर आप अपने विचार बदलें:

unset PYTHONDONTWRITEBYTECODE

2

rm -rनिर्देशिकाओं में पुनरावृत्ति करता है, लेकिन केवल वही निर्देशिकाएँ जो आप देते हैं rm। यह उन निर्देशिकाओं को भी हटा देगा। एक समाधान है:

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

findवर्तमान निर्देशिका में सभी * .pyc फाइलें पुनरावर्ती रूप से मिलेंगी, और forलूप हर एक को हटाते हुए मिली फाइलों की सूची के माध्यम से पुनरावृत्ति करेगा।


यह एक काम करता है, हालांकि मुझे इसे एक .sh फ़ाइल में रखना है और इसे चलाना है (जो मेरे द्वारा ठीक है, मैं इस कमांड का एक से अधिक बार उपयोग
करूंगा

मेरा मानना ​​है कि यह सब 'के साथ अलग एक लाइन पर डाल' है, आप इसे खोल पर चलाने देना चाहिए। लेकिन जब मुझे लगता है कि बैश में, बैश कुछ भी निष्पादित करने के लिए अंत में "किया" का इंतजार करता है ...
क्रिस लुट्ज़

यह एक भयानक एंटीपैटर्न है (और एक बहुत ही सामान्य भी, मैं चाहता हूं कि यह गायब हो सकता है): यह रिक्त स्थान या ग्लोब पात्रों वाले फ़ाइल नाम के साथ टूट जाता है। और यह findअपने -execविधेय के बिंदु को याद करता है: find . -name '*.pyc' -exec rm {} +(अच्छे, छोटे, सुरक्षित, अधिक कुशल)।
गनीउरफ_ग्निउरफ


1

आप दौड़ सकते हैं find . -name "*.pyc" -type f -delete

लेकिन एहतियात के साथ इसका इस्तेमाल करें। find . -name "*.pyc" -type fयह देखने के लिए कि आपको कौन सी फाइलें निकालनी हैं, पहले दौड़ें।

इसके अलावा, सुनिश्चित करें कि -delete आपके कमांड में अंतिम तर्क है। यदि आप इसे * .pyc तर्क से पहले रखते हैं, तो यह सब कुछ हटा देगा।


1

यदि आप प्रोजेक्ट फ़ोल्डर से सभी .pyc फाइलें हटाना चाहते हैं।

सबसे पहले, आपके पास है

cd <path/to/the/folder>

फिर सभी .pyc फ़ाइल ढूंढें और हटाएं।

find . -name \*.pyc -delete
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.