ฉันจะลบไฟล์ทั้งหมดอย่างปลอดภัยด้วยนามสกุลเฉพาะ (เช่น.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อย่างไร