ฉันจะลบไฟล์. pyc ทั้งหมดออกจากโครงการได้อย่างไร


677

ฉันได้เปลี่ยนชื่อไฟล์บางไฟล์ในโครงการขนาดใหญ่พอสมควรและต้องการลบไฟล์. pyc ที่ทิ้งไว้ ฉันลองสคริปต์ทุบตี:

 rm -r *.pyc

แต่นั่นไม่ได้ชดเชยผ่านโฟลเดอร์อย่างที่ฉันคิด ผมทำอะไรผิดหรือเปล่า?


11
มันไม่ทำงานเพราะใน UNIX, globs ถูกขยายโดยเชลล์ไม่ใช่โดยโปรแกรมที่กำลังรัน หากคุณมี a.pyc และ b.pyc ในไดเรกทอรีปัจจุบันและไดเรกทอรี foo and bar rmจะถูกเรียกด้วยอาร์กิวเมนต์ [-r, a.pyc, b.pyc]
ephemient

1
หากคุณกังวลเกี่ยวกับการผลักดันรหัสของคุณให้กับคนอื่นคุณสามารถเพิ่มรหัสนั้นใน. gitignore **/*.pycจากนั้นคุณจะไม่ต้องกังวลกับมันอีก
bubakazouba

คำตอบ:


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

385
ค้นหามี builtin การกระทำ "การลบ" เพื่อให้คุณสามารถทำเพียงfind . -name \*.pyc -delete
Christoffer

51
สิ่งสำคัญที่สุดคือถ้าเป็นเครื่อง dev คุณสามารถตั้งค่า PYTHONDONTWRITEBYTECODE = จริงและคุณจะไม่ต้องทำสิ่งนี้อีกเลย ดู: คำตอบนี้
mlissner

5
{}คุณไม่ได้รับข้อความ จะเกิดอะไรขึ้นถ้าแยกคำโดยไม่ตั้งใจและลบพา ธ กลางที่เกิดขึ้นซึ่งเรียกว่าเป็นส่วนของเส้นทางที่คุณพบ
Robottinosino

20
-deleteไม่ได้เป็นส่วนหนึ่งของข้อกำหนด POSIX findและไม่รับประกันว่าจะอยู่ในการใช้งานของ
chepner

7
หากคุณกลัว - ซึ่งอาจจะดี - ทำผ่านครั้งแรกด้วย -exec echo {} หรือ - ถ้าคุณกลัวมาก - ใช้ rm -i {} ซึ่งถามคุณทุกครั้งหรือ rm - v {} เพื่อให้คุณเห็นสิ่งที่ คุณลบ
jeanM

1021

find . -name '*.pyc' -delete

แน่นอนที่สุด


21
หากเวอร์ชันของคุณfindรองรับ-delete; ไม่ได้เป็นส่วนหนึ่งของมาตรฐาน POSIX
chepner

4
สิ่งนี้จะละเว้นไฟล์. pyo และ__pycache__ไดเรกทอรี ดูคำตอบของฉัน
Wilfred Hughes

ฉันใช้รหัสจากคำตอบที่ยอมรับและใช้งานได้ แต่คำสั่งเหล่านี้สั้นกว่าและเรียบง่าย
Dap

3
-name '*.py?'เพื่อรวม.pyo, .pyc,...
cdosborn

2
ทำให้แน่ใจ - ลบเป็นสิ่งสุดท้ายในคำสั่ง ฉันตั้งใจลบ - ลบทันทีหลังจากค้นหา มันลบทุกอย่าง!
thinkanotherone

85

ในรุ่นปัจจุบันของเดเบียนคุณมีpycleanสคริปต์ที่อยู่ในpython-minimalแพคเกจ

การใช้งานง่าย:

pyclean .

34
เป็นที่น่าสังเกตว่า pyclean จะปรากฏเฉพาะลบไฟล์. pyc ซึ่งมีไฟล์. py ที่สอดคล้องกัน (อย่างน้อยในระบบของฉัน - ubuntu 12.10) ซึ่งหมายความว่ามันไม่เป็นประโยชน์มากในสถานการณ์ที่ไฟล์ต้นฉบับถูกลบและคุณต้องการ เพื่อล้างไฟล์. pyc ที่เหลือ
tigerFinch

@holms pyclean(และตอนนี้py3clean) มาในแพ็คเกจ Debian ดังนั้นจึงไม่ได้อยู่ใน RHEL
duozmo

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กับ vs rm */*.pycคืออะไร? (หลังดูเหมือนจะทำงานให้ฉันในพื้นที่)
Taylor Edmiston

1
@TaylorEdmiston rm */*.pycจะลบ.pycไฟล์ทั้งหมดในทุกไดเรกทอรีย่อยที่มีความลึก 1. rm **/*.pycจะลบ.pycไฟล์ทั้งหมดในทุกไดเรกทอรีย่อยที่มีความลึก 0+
Adam Stewart

@ AdamStewart ขอบคุณที่เพิ่มสิ่งนี้ สำหรับคนอื่น ๆ ที่สะดุดในหัวข้อนี้ปัญหาที่ฉันพบคือทุบตีของ Apple ที่มาพร้อมกับ OS X ไม่ได้รวม globstar ( **ทำหน้าที่เหมือน*เมื่อทำงานแทนและทำงานshopt globstarผิดพลาด)
เทย์เลอร์เอ็ดมิสตัน

30

ฉันเคยใช้นามแฝงว่า:

$ which pycclean

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

12
ในเดเบียนปัจจุบันมันเป็น pyclean
jb

7
สิ่งนี้ไม่สามารถจัดการกับช่องว่างในชื่อไฟล์ได้ดี คุณควรใช้find -print0และxargs -0แทน
r3m0t

2
ทำไมคุณต้องการรหัสหลามที่มีช่องว่างในชื่อไฟล์ / โฟลเดอร์ มันถูกกฎหมายหรือไม่?
coredumperror

@CoreDumpError ใช่แล้วจริง ๆ แล้วใน Windows Python ติดตั้งในไดเรกทอรีที่มีช่องว่าง ("Program Files")
พอลเดรเปอร์

ล่ามหลามอาจติดตั้งโดยมีค่าเริ่มต้น แต่ก็แทบจะไม่เป็นสถานที่ที่ดีที่จะนำคุณรหัส นอกจากนี้คุณไม่ต้องการให้โฟลเดอร์ Program Files เป็นส่วนหนึ่งของโครงสร้างแพ็คเกจของคุณซึ่งเป็นสาเหตุที่ฉันต้องระวังเรื่องไวยากรณ์
coredumperror

24

สำหรับผู้ใช้ windows:

del /S *.pyc

การวางสิ่งนี้ไว้ในสคริปต์แบบแบตช์ทำให้ทุกอย่างง่ายขึ้น ขอบคุณ
Nick Gotch

และถ้าคุณใช้ Powershell สิ่งนี้สามารถใช้กับ "cmd" -> Run command -> "exit"
np8

18
find . -name '*.pyc' -print0 | xargs -0 rm

การค้นหาจะค้นหาไฟล์ * .pyc ซ้ำ ๆ xargs ใช้รายการของชื่อนั้นและส่งไปยัง rm -print0 และ -0 บอกทั้งสองคำสั่งเพื่อแยกชื่อไฟล์ด้วยอักขระ null สิ่งนี้ทำให้มันทำงานอย่างถูกต้องกับชื่อไฟล์ที่มีช่องว่างและแม้แต่ชื่อไฟล์ที่มีบรรทัดใหม่

การแก้ปัญหาด้วย -exec ทำงานได้ แต่มันจะทำสำเนา rm ใหม่สำหรับทุกไฟล์ สำหรับระบบที่ช้าหรือมีไฟล์จำนวนมากมันจะใช้เวลานานเกินไป

คุณสามารถเพิ่มอีกสองสาม args:

find . -iname '*.pyc' -print0 | xargs -0 --no-run-if-empty  rm

iname เพิ่มความรู้สึกตัวพิมพ์เล็กและตัวพิมพ์เช่น * .PYC no-run-if-empty ช่วยให้คุณได้รับข้อผิดพลาดจาก rm หากคุณไม่มีไฟล์ดังกล่าว



11

นอกจากนี้ผู้คนมักจะต้องการที่จะลบทั้งหมด*.pyc, *.pyoไฟล์และ__pycache__ไดเรกทอรีซ้ำในไดเรกทอรีปัจจุบัน

คำสั่ง:

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

นี่เป็นคำตอบที่ดี แต่โซลูชัน Python แบบธรรมดาจะเป็นแบบข้ามแพลตฟอร์มและเป็นที่นิยมมากกว่า ขณะที่ส่วนตัวผมไม่สนใจเกี่ยวกับ Windows อาจจะครึ่งหนึ่งของงูหลามชีวิตของประชากรใน Windows - และfind, grepและเพื่อน ๆ ไม่ได้ทำงานที่นั่น
Peterino

พวกเขาทำถ้าคุณติดตั้งเครื่องมือ ฉันขอแนะนำให้ผู้ใช้ windows CLI ทุกคนทำเช่นนั้นเพื่อลดความยุ่งยากข้าม: superuser.com/questions/168202/…
DylanYoung

8

เพียงโยนตัวแปรอื่นลงในการผสมคุณสามารถใช้ backquotes ดังนี้

rm `find . -name *.pyc`

5
rmนี้มีอุปสรรคเล็กน้อยของความล้มเหลวถ้ามีการแข่งขันมากเกินไปที่จะมีข้อโต้แย้งมากเกินไปที่จะส่งผ่านไปยัง
chepner

8

นามสกุล Django

หมายเหตุ: คำตอบนี้เฉพาะเจาะจงมากสำหรับโครงการ Djangoที่ใช้Django Extensionอยู่แล้ว

python manage.py clean_pyc

การดำเนินงานที่สามารถดูได้ในรหัสแหล่งที่มาของ


7

เรียกซ้ำเต็ม

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

น่าสนใจสิ่งนี้เปรียบเทียบกับคำตอบของ Andy และ Bill อย่างไร
Austin Henley

3
ชุดหนึ่ง**คือซ้ำซ้อนและในd0kคำตอบของคุณจะต้องมีการเปิดใช้งาน globstar ในทุบตี 4+ เพื่อที่จะทำงานได้ตามที่ต้องการ นั่นคือทำshopt -s globstarหรือมีในหนึ่งในทุบตีที่มาของคุณ ไฟล์
Reinstate Monica โปรด

1
นอกจากนี้ยังllใช้นามแฝงทั่วไปเพื่อสิ่งที่ต้องการls -lแต่ไม่ได้จริงๆคำสั่งหรือการพกพา ดังนั้นในการเรียกรายการ.pycไฟล์ซ้ำทั้งหมดซ้ำ.คุณควรทำบางอย่างเช่นecho **/*.pycเปิดใช้งาน globstar แทน
Reinstate Monica ได้โปรด

3

วิ่งครั้งแรก:

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

จากนั้นเพิ่ม:

export PYTHONDONTWRITEBYTECODE=1

ถึง ~ / .profile


3

หากคุณไม่ต้องการ. pyc อีกต่อไปคุณสามารถใช้บรรทัดเดียวนี้ในเทอร์มินัล:

export PYTHONDONTWRITEBYTECODE=1

ถ้าคุณเปลี่ยนใจ:

unset PYTHONDONTWRITEBYTECODE

2

rm -rrecurses ลงในไดเรกทอรี rmแต่ไดเรกทอรีที่คุณให้กับ มันจะลบไดเรกทอรีเหล่านั้นด้วย ทางออกหนึ่งคือ:

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

findจะค้นหาไฟล์ * .pyc ทั้งหมดซ้ำในไดเรกทอรีปัจจุบันและforลูปจะวนซ้ำตามรายการไฟล์ที่พบลบแต่ละไฟล์


นี้เป็นหนึ่งในผลงาน แต่ผมต้องใส่ไว้ในไฟล์ .sh และเรียกว่า (ซึ่งเป็นเรื่องปกติโดยผมจะใช้คำสั่งนี้มากกว่าหนึ่งครั้ง)
Teifion

ฉันเชื่อว่าการรวมทั้งหมดไว้ในบรรทัดเดียวคั่นด้วย ';' ควรให้คุณเรียกใช้ที่เชลล์ แต่เมื่อฉันพิมพ์ว่าในทุบตีรอทุบตีสำหรับการ "ทำ" ในตอนท้ายในการดำเนินการอะไร ...
คริสลัทซ์

นั่นคือAntipattern ที่น่ากลัว(และเป็นสิ่งที่ธรรมดามากเช่นกันฉันหวังว่ามันจะหายไปได้): มันแบ่งกับชื่อไฟล์ที่มีช่องว่างหรือตัวอักษรกลม และมันก็พลาดจุดที่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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.