วิธีการลบไฟล์เท่านั้น แต่เก็บโครงสร้างไดเรกทอรีหรือไม่


16

ฉันต้องการลบทุกไฟล์ แต่เก็บโครงสร้างโฟลเดอร์ไว้ มีวิธีหรือไม่?

หมายเหตุ: (ฉันใช้ GNU bash 4.1.5)


1
คุณหมายถึง "แยก" ออกไปอย่างแน่นอน คุณใช้คำสั่งบางอย่างหรือไม่? ถ้าเป็นเช่นนั้นโปรดอัปเดตคำถามของคุณเพื่อรวมสิ่งนี้
slm


ฉันคิดว่าคุณหมายถึงลบทุกไฟล์
slm

1
@slm ฉันอัปเดตด้วยคำสั่งที่ฉันมักจะใช้เพื่อแยกไฟล์
Tom Brito

ไม่คุณไม่ได้ :-) หรือถ้าคุณทำคุณลบมันออกอีกครั้ง
Mawg พูดว่าการคืนสถานะโมนิก้า

คำตอบ:


18

ลองสิ่งนี้:

find . ! -type d -exec rm '{}' \;

การดำเนินการนี้จะลบทุกไฟล์เดียวไม่รวมไดเรกทอรีด้านล่างไดเรกทอรีทำงานปัจจุบัน ระวังให้มากด้วยคำสั่งนี้

หากเวอร์ชันของfindบนเครื่องของคุณรองรับคุณยังสามารถใช้

find . ! -type d -delete

@slm: ฉันไม่แน่ใจว่ามันพกพาได้อย่างไร ฉันได้เพิ่มมันเป็นตัวเลือกรอง ฉันเพิ่งรู้ว่าการแก้ไขของฉันทำให้คำตอบของฉันเหมือนกับคุณจริงๆ ขอโทษสำหรับเรื่องนั้น; มันไม่ใช่ความตั้งใจของฉัน

'{}' ป้องกันช่องว่างในไฟล์หรือไม่ ฉันเห็นคุณใช้ตลอดเวลาและฉันไม่คิดว่าฉันเคยเห็นมันใช้มาก่อนที่จะเห็นคุณโพสต์โซลูชันด้วย
slm

จาก GNU ค้นหา manpage: "สังเกตว่าเครื่องหมายวงเล็บอยู่ในเครื่องหมายอัญประกาศเดี่ยวเพื่อป้องกันไม่ให้ตีความเป็นเครื่องหมายวรรคตอนของเชลล์สคริปต์" ฉันไม่แน่ใจว่าเมื่อจำเป็น ฉันทำมันจนติดนิสัย findคำสั่งไม่เคยเห็นเครื่องหมายอัญประกาศ มันเพิ่งเห็น{}เครื่องหมายเป็นอาร์กิวเมนต์

ฉันเห็นมันในตัวอย่าง แต่เทมเพลตแสดงสิ่งนี้ " -exec command {} +" & นี้ " -exec command ;" ฉันเคยใช้\;ในอดีตไม่เคย '{}'
slm

@slm: findแม่แบบที่ยังไม่ได้แสดงให้เห็นถึงการหลบหนีของอัฒภาคซึ่งโดยทั่วไปจำเป็นเมื่อใช้เปลือกในการดำเนินการ ฉันคิดว่าเทมเพลตนั้นมีวัตถุประสงค์เพื่อแสดงว่าอาร์กิวเมนต์ใดที่findคำสั่งนั้นต้องการและไม่ต้องกังวลเกี่ยวกับเชลล์ใด ๆ

7

คุณสามารถใช้คำสั่งfindเพื่อค้นหาทุกไฟล์ แต่บำรุงรักษาโครงสร้างไดเรกทอรี:

$ find /some/dir -type f -exec rm {} +

ตาม Unix & Linux คำถาม & คำตอบนี้: gnu ค้นหาและปิดบัง {} สำหรับเชลล์บางตัว - อันไหน? การหลบหนี{}ด้วยเห็บเดี่ยว ( ') ดูเหมือนจะไม่จำเป็นอีกต่อไปกับกระสุนสมัยใหม่เช่น Bash


1

วิธีง่ายๆในการลบไฟล์ปกติทุกไฟล์ในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยแบบเรียกซ้ำ:

zsh -c 'rm **/*(.)'

zsh เท่านั้นที่มีตัวระบุแบบกลมเพื่อจับคู่ไฟล์ตามประเภท อย่างไรก็ตามrmคำสั่งไม่ทำงานในไดเรกทอรีดังนั้นในทุบตีคุณสามารถใช้

shopt -s globstar
rm **/*

สิ่งนี้ใช้ไม่ได้กับคำสั่งอื่นนอกเหนือจากrmนี้ โดยทั่วไปคุณสามารถใช้find:

find . -type f -delete

หรือถ้าคุณfindไม่สนับสนุน-delete:

find . -type f -exec rm {} +

-2

ฉันมีความต้องการที่คล้ายกันในการลบไฟล์ออกจากเส้นทางและไดเรกทอรีย่อย (กรองตามเวลา) โดยไม่ต้องลบโครงสร้างไดเรกทอรี

และฉันได้ใช้รูปแบบด้านล่างซึ่งใช้งานได้สำหรับฉัน

ค้นหา / test123 / home / test_file_hip / data / nfs -mtime +6 -type f -exec rm {} \;

Syntex: find (พา ธ ของไฟล์) -mtime (มากกว่าหรือน้อยกว่าวัน) -type f -exec rm {} \;

-type: พูดถึงชนิดของไฟล์ "f" สำหรับไดเรกทอรี "d" -exec: execute คำสั่ง rm: remove {}: เอาต์พุตของคำสั่ง find

หมายเหตุ: อย่าทดสอบก่อนใช้งาน โปรดแก้ไขหรืออัปเดตหากฉันพลาดอะไรเลย


1
เนื่องจากนี่เป็นข้อกำหนดเพิ่มเติมที่ไม่ได้กล่าวถึงโดย OP และเนื่องจากfind ... rmโครงสร้างพื้นฐานได้รับการคุ้มครองแล้วฉันไม่แน่ใจว่านี่เป็นการสนับสนุนที่มีค่าสำหรับคำตอบใหม่สำหรับคำถามนี้
Jeff Schaller
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.