ลบไฟล์ทั้งหมดซ้ำโดยไม่ลบไดเรกทอรี


10

ฉันต้องการที่จะ "ล้าง" ไฟล์ทั้งหมดของไดเรกทอรีรวมถึงไฟล์ทั้งหมดในไดเรกทอรีย่อย แต่ฉันต้องการที่จะออกจากไดเรกทอรีย่อยในสถานที่ ฉันเข้าใจrm -rว่ามันจะลบไดเรกทอรีย่อยด้วยเช่นกัน

ฉันไม่ต้องการลบไฟล์ที่ซ่อนอยู่ (จุด)

สิ่งนี้สามารถทำได้?


1
find -type f ! -name "[.]*" -deleteไม่เหมาะหรือ
Costas

ฉันไม่รู้ นั่นคือสิ่งที่ฉันถาม
Scott Wilton

ลองโดยไม่ต้อง-delete- เพียงพิมพ์ชื่อไฟล์เพื่อลบ
Costas

คุณต้องการลบไฟล์ (ซ่อนหรือไม่) ในไดเรกทอรีที่ซ่อนอยู่หรือไม่?
Stéphane Chazelas

สิ่งที่เกี่ยวกับการเชื่อมโยงไปยังไดเรกทอรี?
Stéphane Chazelas

คำตอบ:


10

ใช้findสำหรับที่:

find . ! -name '.*' ! -type d -exec rm -- {} +

1
การใช้งานทั้งหมดไม่พบมี-delete
wurtel

3
@RomeoNinov โปรดอ่านคำถาม OP:I do not want to delete hidden (dot) files.
jimmij

1
@Costas, ไม่มี, ไม่มีเชลล์ที่ต้องมีการหลบหนี+(อย่างน้อยก็ไม่ต้องอยู่ในตระกูล Bourne, csh หรือ rc) มีตำนานที่บอกว่าcshต้องมีการหลบหนีรุ่นเก่า{}แต่ฉันไม่เคยเจอมันมาก่อน
Stéphane Chazelas

1
@ScottWilton ไดเรกทอรีที่ซ่อนอยู่รวมอยู่ แต่ไฟล์ที่ซ่อนอยู่ในไดเรกทอรีที่ซ่อนไม่ได้ หากคุณต้องการที่จะปฏิเสธไฟล์ทั้งหมดในไดเรกทอรีที่ซ่อนอยู่find . ! -name '.*' ! -type d ! -path '*/.*'ควรทำงาน
jimmij

1
@ จิมมี่ชอบที่find . -name '.?*' -prune -o ! -type d -exec rm {} +จะหลีกเลี่ยงการสืบทอดในสิ่งเหล่านั้นทั้งหมด โปรดทราบว่า--ไม่จำเป็นที่นี่ (ไม่เป็นอันตรายต่อแม้ว่า) ./ตั้งแต่เส้นทางเริ่มต้นด้วย
Stéphane Chazelas

0

ลองสิ่งที่ชอบ:

find <path> ! -name '.*' -type f -exec rm {} \;

เหตุผลใดที่จะลบไฟล์ทีละไฟล์แทนที่จะทำสิ่งต่าง ๆ ด้วยความเร็ว.... -exec rm {} + ?
Anthon

ฉันชอบทำสิ่งหนึ่งต่อหนึ่ง การดำเนินการแบบมวลชน (และขนาน) มีผลข้างเคียงที่แปลก (และไม่เป็นที่พอใจ) (เช่นสร้างภาระมหาศาลในระบบย่อย I / O)
Romeo Ninov

1
-exec rm {} +ไม่ขนานมันแค่เรียกrmชื่อไฟล์หลาย ๆ ชื่อ มันเรียกใช้rmการร้องขอน้อยลงดังนั้นจึงเป็นมิตรกับทรัพยากรมากขึ้น ถ้ามันปลอดภัยน้อยกว่าเล็กน้อยในการขยายหน้าต่างการแข่งขันภายในซึ่งองค์ประกอบไดเรกทอรีของไฟล์ที่จะลบอาจถูกเปลี่ยนเป็น symlink แต่เพียงอย่างเดียว-deleteหรือ-execdir rm {} \;จะอยู่อย่างเต็มที่ว่า
Stéphane Chazelas

@ StéphaneChazelasไม่ใช่ของเหล่านี้ (-delete หรือ -execdir) ใน UNIX และฉันไม่เห็นคำถามที่จะพูดถึงลินุกซ์!
Romeo Ninov

@RomeoNinov ใช่ฉันพูดในความคิดเห็นอื่นที่นี่ว่า-execเป็นมาตรฐานเท่านั้น -deleteและ-execdirมาจาก BSD แม้ว่า GNU จะเพิ่มพวกเขาประมาณ 10 ปีต่อมา ไม่ว่าในกรณีใด ๆ ที่ไม่เกี่ยวข้องกับ Linux ซึ่งเป็นเพียงเคอร์เนล
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.