ฉันได้เปลี่ยนชื่อไฟล์บางไฟล์ในโครงการขนาดใหญ่พอสมควรและต้องการลบไฟล์. pyc ที่ทิ้งไว้ ฉันลองสคริปต์ทุบตี:
rm -r *.pyc
แต่นั่นไม่ได้ชดเชยผ่านโฟลเดอร์อย่างที่ฉันคิด ผมทำอะไรผิดหรือเปล่า?
**/*.pycจากนั้นคุณจะไม่ต้องกังวลกับมันอีก
ฉันได้เปลี่ยนชื่อไฟล์บางไฟล์ในโครงการขนาดใหญ่พอสมควรและต้องการลบไฟล์. pyc ที่ทิ้งไว้ ฉันลองสคริปต์ทุบตี:
rm -r *.pyc
แต่นั่นไม่ได้ชดเชยผ่านโฟลเดอร์อย่างที่ฉันคิด ผมทำอะไรผิดหรือเปล่า?
**/*.pycจากนั้นคุณจะไม่ต้องกังวลกับมันอีก
คำตอบ:
find . -name "*.pyc" -exec rm -f {} \;
find . -name \*.pyc -delete
{}คุณไม่ได้รับข้อความ จะเกิดอะไรขึ้นถ้าแยกคำโดยไม่ตั้งใจและลบพา ธ กลางที่เกิดขึ้นซึ่งเรียกว่าเป็นส่วนของเส้นทางที่คุณพบ
-deleteไม่ได้เป็นส่วนหนึ่งของข้อกำหนด POSIX findและไม่รับประกันว่าจะอยู่ในการใช้งานของ
find . -name '*.pyc' -delete
แน่นอนที่สุด
findรองรับ-delete; ไม่ได้เป็นส่วนหนึ่งของมาตรฐาน POSIX
__pycache__ไดเรกทอรี ดูคำตอบของฉัน
-name '*.py?'เพื่อรวม.pyo, .pyc,...
ในรุ่นปัจจุบันของเดเบียนคุณมีpycleanสคริปต์ที่อยู่ใน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มักจะให้คำเตือนเกี่ยวกับเส้นทางที่หายไปเพราะเห็นได้ชัดว่าเนื้อหาจะถูกเพิ่มลงในคิวก่อนที่จะลบโฟลเดอร์ 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กับ vs rm */*.pycคืออะไร? (หลังดูเหมือนจะทำงานให้ฉันในพื้นที่)
rm */*.pycจะลบ.pycไฟล์ทั้งหมดในทุกไดเรกทอรีย่อยที่มีความลึก 1. rm **/*.pycจะลบ.pycไฟล์ทั้งหมดในทุกไดเรกทอรีย่อยที่มีความลึก 0+
**ทำหน้าที่เหมือน*เมื่อทำงานแทนและทำงานshopt globstarผิดพลาด)
ฉันเคยใช้นามแฝงว่า:
$ which pycclean
pycclean is aliased to `find . -name "*.pyc" | xargs -I {} rm -v "{}"'
find -print0และxargs -0แทน
สำหรับผู้ใช้ windows:
del /S *.pyc
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 หากคุณไม่มีไฟล์ดังกล่าว
$ find . -name '*.pyc' -delete
มันเร็วกว่า
$ find . -name "*.pyc" -exec rm -rf {} \;
นอกจากนี้ผู้คนมักจะต้องการที่จะลบทั้งหมด*.pyc, *.pyoไฟล์และ__pycache__ไดเรกทอรีซ้ำในไดเรกทอรีปัจจุบัน
คำสั่ง:
find . | grep -E "(__pycache__|\.pyc|\.pyo$)" | xargs rm -rf
find, grepและเพื่อน ๆ ไม่ได้ทำงานที่นั่น
เพียงโยนตัวแปรอื่นลงในการผสมคุณสามารถใช้ backquotes ดังนี้
rm `find . -name *.pyc`
rmนี้มีอุปสรรคเล็กน้อยของความล้มเหลวถ้ามีการแข่งขันมากเกินไปที่จะมีข้อโต้แย้งมากเกินไปที่จะส่งผ่านไปยัง
หมายเหตุ: คำตอบนี้เฉพาะเจาะจงมากสำหรับโครงการ Djangoที่ใช้Django Extensionอยู่แล้ว
python manage.py clean_pyc
เรียกซ้ำเต็ม
ll **/**/*.pyc
rm **/**/*.pyc
**คือซ้ำซ้อนและในd0kคำตอบของคุณจะต้องมีการเปิดใช้งาน globstar ในทุบตี 4+ เพื่อที่จะทำงานได้ตามที่ต้องการ นั่นคือทำshopt -s globstarหรือมีในหนึ่งในทุบตีที่มาของคุณ ไฟล์
llใช้นามแฝงทั่วไปเพื่อสิ่งที่ต้องการls -lแต่ไม่ได้จริงๆคำสั่งหรือการพกพา ดังนั้นในการเรียกรายการ.pycไฟล์ซ้ำทั้งหมดซ้ำ.คุณควรทำบางอย่างเช่นecho **/*.pycเปิดใช้งาน globstar แทน
วิ่งครั้งแรก:
find . -type f -name "*.py[c|o]" -exec rm -f {} +
จากนั้นเพิ่ม:
export PYTHONDONTWRITEBYTECODE=1
ถึง ~ / .profile
หากคุณไม่ต้องการ. pyc อีกต่อไปคุณสามารถใช้บรรทัดเดียวนี้ในเทอร์มินัล:
export PYTHONDONTWRITEBYTECODE=1
ถ้าคุณเปลี่ยนใจ:
unset PYTHONDONTWRITEBYTECODE
rm -rrecurses ลงในไดเรกทอรี rmแต่ไดเรกทอรีที่คุณให้กับ มันจะลบไดเรกทอรีเหล่านั้นด้วย ทางออกหนึ่งคือ:
for i in $( find . -name *.pyc )
do
rm $i
done
findจะค้นหาไฟล์ * .pyc ทั้งหมดซ้ำในไดเรกทอรีปัจจุบันและforลูปจะวนซ้ำตามรายการไฟล์ที่พบลบแต่ละไฟล์
findมีภาคของ-exec: find . -name '*.pyc' -exec rm {} +(ดีกว่า, สั้นกว่า, ปลอดภัย, แข็งแกร่ง, มีประสิทธิภาพมากขึ้น)
find . -name "*.pyc"|xargs rm -rf
find . -name "*.pyc" -type f -deleteคุณสามารถเรียกใช้
แต่ใช้ด้วยความระมัดระวัง เรียกใช้ก่อนfind . -name "*.pyc" -type fเพื่อดูว่าคุณจะลบไฟล์ใด
นอกจากนี้ตรวจสอบให้แน่ใจว่า -delete เป็นอาร์กิวเมนต์สุดท้ายในคำสั่งของคุณ หากคุณใส่ไว้หน้าอาร์กิวเมนต์ -name * .pyc มันจะลบทุกอย่าง
หากคุณต้องการลบไฟล์. pyc ทั้งหมดออกจากโฟลเดอร์โครงการ
ก่อนอื่นคุณต้อง
cd <path/to/the/folder>
จากนั้นค้นหาไฟล์. pyc ทั้งหมดและลบ
find . -name \*.pyc -delete
rmจะถูกเรียกด้วยอาร์กิวเมนต์ [-r, a.pyc, b.pyc]