ฉันได้เปลี่ยนชื่อไฟล์บางไฟล์ในโครงการขนาดใหญ่พอสมควรและต้องการลบไฟล์. 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 -r
recurses ลงในไดเรกทอรี 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]