ฉันจะลบไฟล์ทั้งหมดอย่างปลอดภัยด้วยนามสกุลเฉพาะ (เช่น.bak
) จากไดเรกทอรีปัจจุบันและโฟลเดอร์ย่อยทั้งหมดโดยใช้บรรทัดคำสั่งเดียวได้อย่างไร เพียงแค่ฉันกลัวที่จะใช้rm
เนื่องจากฉันใช้ผิดครั้งเดียวและตอนนี้ฉันต้องการคำแนะนำ
ฉันจะลบไฟล์ทั้งหมดอย่างปลอดภัยด้วยนามสกุลเฉพาะ (เช่น.bak
) จากไดเรกทอรีปัจจุบันและโฟลเดอร์ย่อยทั้งหมดโดยใช้บรรทัดคำสั่งเดียวได้อย่างไร เพียงแค่ฉันกลัวที่จะใช้rm
เนื่องจากฉันใช้ผิดครั้งเดียวและตอนนี้ฉันต้องการคำแนะนำ
คำตอบ:
คุณไม่จำเป็นต้องใช้rm
ในกรณีนี้ถ้าคุณกลัว การใช้find
:
find . -name "*.bak" -type f -delete
แต่ใช้ด้วยความระมัดระวัง เรียกใช้ก่อน:
find . -name "*.bak" -type f
เพื่อดูว่าคุณจะลบไฟล์ใด
นอกจากนี้ตรวจสอบให้แน่ใจว่า-delete
เป็นอาร์กิวเมนต์สุดท้ายในคำสั่งของคุณ หากคุณใส่มันก่อน-name *.bak argument
, มันจะลบทุกอย่าง
ดูman find
และman rm
สำหรับข้อมูลเพิ่มเติมและดูคำถามที่เกี่ยวข้องนี้ใน SE:
rm *.bak
จะไม่ทำงานสำหรับไดเรกทอรีย่อย
rm *.bak
จะลบไฟล์ทั้งหมดที่ลงท้ายด้วย. bak ในไดเรกทอรีปัจจุบันเท่านั้น เมื่อต้องการทำสิ่งต่าง ๆ ในไดเรกทอรีย่อยที่คุณต้องการทำซอกับ globs ใช้ตัวเลือก -r หรือใช้ตัวอย่างการค้นหา
rm -r *.bak
! นอกจากนี้ยังลบไดเรกทอรีที่ลงท้าย.bak
ด้วยเนื้อหาทั้งหมด
-delete
เป็นอาร์กิวเมนต์สุดท้ายในคำสั่งของคุณ หากคุณใส่ไว้หน้า-name *.bak
อาร์กิวเมนต์มันจะลบทุกอย่าง
find . -name "*.bak" -type f -print0 | xargs -0 /bin/rm -f
-delete
find
ข้อมูลเพิ่มเติมสามารถพบได้ในGNU คู่มือรายการสำหรับการลบไฟล์ที่มีการค้นพบ
เรียกใช้คำสั่งshopt -s globstar
ก่อน คุณสามารถเรียกใช้สิ่งนั้นได้ในบรรทัดคำสั่งและจะมีผลเฉพาะในหน้าต่างเชลล์นั้น คุณสามารถใส่มันลงไป.bashrc
จากนั้นกระสุนที่เพิ่งเริ่มใหม่ทั้งหมดจะมารับมัน ผลของคำสั่งนั้นคือการ**/
จับคู่ไฟล์ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยซ้ำ (โดยค่าเริ่มต้น**/
หมายถึงสิ่งเดียวกับ*/
: เฉพาะในไดเรกทอรีย่อยทันที) แล้ว:
rm **/*.bak
(หรือgvfs-trash **/*.bak
สิ่งที่คุณมี)
การลบไฟล์สำหรับฉันสิ่งที่คุณไม่ควรใช้rm
สำหรับ นี่คือทางเลือก:
sudo apt-get install gvfs # install a tool that allows you to put stuff in the trash
alias "trash"="gvfs-trash" # you can also put this in .bash_aliases or simply use the command without alias
trash *.bak # trash the files (thus moving them to the trash bin)
ในฐานะที่เป็น Flimm ระบุในความคิดเห็น:
แพ็คเกจ
trash-cli
ทำสิ่งเดียวกันgvfs-trash
โดยไม่มีการพึ่งพา gvfs
ดังนั้น:
sudo apt-get install trash-cli
คุณไม่จำเป็นต้องสร้างนามแฝงสำหรับสิ่งนี้เนื่องจากtrash-cli
แพ็คเกจให้คำสั่งtrash
ซึ่งทำสิ่งที่เราต้องการ
เมื่อเอลียาห์คาเกนแสดงความคิดเห็นอย่างละเอียดคุณสามารถใช้การเรียกซ้ำfind
นี้ ในกรณีนี้คุณไม่สามารถใช้นามแฝงได้ดังนั้นคำสั่งด้านล่างจะถือว่าคุณได้ติดตั้งtrash-cli
แล้ว ฉันสรุปความคิดเห็นของ Eliah:
คำสั่งนี้ค้นหาและแสดง.bak
ไฟล์และ symlink ทั้งหมดที่ใดก็ได้ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีย่อยหรือด้านล่าง
find . -name '*.bak' -xtype f
เพื่อที่จะลบผนวก-exec
กับtrash
คำสั่ง:
find . -name '*.bak' -xtype f -exec trash {} +
-xtype f
เลือกไฟล์และ symlink ไปยังไฟล์ แต่ไม่ใช่โฟลเดอร์ หากต้องการลบโฟลเดอร์. bak ให้ลบส่วนนั้นออกและใช้-execdir
เพื่อหลีกเลี่ยงcannot trash non-existent
ข้อผิดพลาดสำหรับ.bak
ไฟล์ภายใน.bak
ไดเรกทอรี:
find . -name '*.bak' -execdir trash {} +
rm
เพื่อลบสิ่งต่าง ๆ " เป็นคำโต้เถียง แต่ฉันต้องยอมรับว่ามันฉลาดกว่าที่จะใช้สิ่งที่จะทำให้คุณเลิกทำ
trash-cli
จะเป็นสิ่งเดียวกันเป็นได้โดยไม่ต้องพึ่งพาgvfs-trash
gvfs
find . -name "*.bak" -type f
จะแสดงสิ่งที่ถูกtrash *.bak
ลบ นั่นคือสิ่งที่คุณหมายถึงจริงเหรอ? คุณสามารถย้ายไดเรกทอรีไปยังถังขยะด้วยtrash
หรือgvfs-trash
แต่trash *.bak
จะย้ายเฉพาะไฟล์และไดเรกทอรีที่มีชื่อลงท้ายด้วย.bak
และอยู่ในไดเรกทอรีปัจจุบันทันที เปลือกขยาย*.bak
ดังนั้นtrash *.bak
จะไม่ส่งผลกระทบต่อไฟล์ในไดเรกทอรีย่อยไม่ได้ว่าตัวเองชื่อ.bak
.bak
ls *.bak
(ซึ่งฉันคิดว่าคุณหมายถึง) รายการสิ่งที่trash *.bak
ถังขยะ find . -name '*.bak' -xtype f -exec trash {} +
ทิ้ง.bak
ไฟล์ทั้งหมดที่อยู่.
ข้างใต้ ไม่สามารถใช้นามแฝงได้ดังนั้นควรติดตั้งtrash-cli
หรือเขียนgvfs-trash
แทน นี่คือตัวอย่าง -xtype f
เลือกไฟล์และ symlink ไปยังไฟล์ แต่ไม่ใช่โฟลเดอร์ ในการลบ.bak
โฟลเดอร์ด้วยให้ใช้find . -name '*.bak' -execdir trash {} +
ซึ่งจะหลีกเลี่ยงcannot trash non existent
ข้อผิดพลาดสำหรับ.bak
ไฟล์ภายใน.bak
ไดเรกทอรี โปรดอย่าลังเลที่จะใช้สิ่งนี้ในคำตอบของคุณ
หากคุณต้องการลบไฟล์ทั้งหมดบางประเภท แต่เพียง 1 โฟลเดอร์ "ลึก" จากโฟลเดอร์ปัจจุบัน:
find . -maxdepth 2 -name "*.log" -type f -delete
-maxdepth 2เนื่องจากไดเรกทอรีปัจจุบัน " . " นับเป็นโฟลเดอร์แรก
ลบไฟล์ทั้งหมดด้วยชื่อที่พิจารณาหรือ postfix ซ้ำ:
find . -name '*.pyc' -type f -delete
ลบไดเรกทอรีทั้งหมดที่มีชื่อที่พิจารณาซ้ำ:
find ~ -path '*/__pycache__/*' -delete
find ~ -type d -name '__pycache__' -empty -delete
ควบคุมได้ค่อนข้างน้อย แต่ในบรรทัดเดียว:
find ~ -path '*/__pycache__*' -delete
[ หมายเหตุ ]:
d
เป็นตัวเลือกไดเรกทอรีและf
เป็นตัวเลือกไฟล์
หากคุณอยู่ใน repo คอมไพล์คุณสามารถใช้:
git clean -fdx
นี่เป็นการลบไฟล์และไฟล์ที่ไม่ได้ติดตามใน. gitignore
rm *.bak
อย่างไร