ฉันจะทำให้ "ค้นหา" แยกโฟลเดอร์ที่ค้นหาได้อย่างไร


18

ฉันใช้คำสั่งต่อไปนี้:

find /var/www/html/content/processing -type d -mtime +1 -exec rm -rf {} \;

ฉันต้องการลบโฟลเดอร์ทั้งหมดในโฟลเดอร์processing(ไม่ควรลบโฟลเดอร์ประมวลผล)

คำสั่งคือการลบprocessingโฟลเดอร์เช่นกัน ฉันจะ จำกัด สคริปต์เพื่อลบเฉพาะโฟลเดอร์ภายใต้โฟลเดอร์นั้นได้อย่างไร


คำตอบ:


32

วิธีที่ง่ายที่สุดคือเพียงเพิ่ม-mindepth 1ซึ่งจะข้ามลำดับชั้นความลึกแรกและทำให้ออกจากไดเรกทอรีหลักของคุณ

นอกจากนี้คุณไม่จำเป็นต้อง-execโทรเพิ่มrmคุณสามารถเพียงแค่deleteโฟลเดอร์โดยตรงหากไม่มีไฟล์

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -delete

หากพวกเขาไม่ว่างเปล่า:

find /var/www/html/content/processing -mindepth 1 -type d -mtime +1 -exec rm -rf {} \;

หากคุณขี้เกียจคุณสามารถเพิ่มไวด์การ์ดได้ เนื่องจาก*ไม่รวมไดเรกทอรีปัจจุบันโดยค่าเริ่มต้น ( ยกเว้นdotglobมีการตั้งค่า ) คุณสามารถทำได้:

find /var/www/html/content/processing/* -type d -mtime +1 -delete

อย่างไรก็ตามสิ่งนี้จะไม่รวมโฟลเดอร์ที่ซ่อนอยู่อีกครั้งเนื่องจากdotglobตัวเลือก


สวัสดีฉันได้รับ "ค้นหา: คำเตือน: คุณได้ระบุตัวเลือก -mindepth หลังจากอาร์กิวเมนต์ที่ไม่ใช่ตัวเลือก - ประเภท แต่ตัวเลือกไม่ได้ตำแหน่ง (-mindepth ส่งผลกระทบต่อการทดสอบที่ระบุไว้ก่อนหน้านี้และที่ระบุหลังจากนั้น) โปรดระบุตัวเลือก ก่อนอาร์กิวเมนต์อื่น ๆ "และ" find: ไม่สามารถลบ `/ folder / 50d82faf0e09e ': ไดเรกทอรีไม่ว่าง"
Elad Dotan

เพิ่มความลึกก่อนพิมพ์ ในการลบไดเรกทอรีเมื่อไม่ว่างคุณสามารถใช้วิธีการ rm ที่คุณมีในตอนแรก
slhck

4

ปัญหาคือการค้นหาส่งคืนไดเรกทอรีปัจจุบัน (.) พร้อมกับไดเรกทอรีอื่น ๆ ดังนั้นจึงจะลบโฟลเดอร์การประมวลผลเช่นเดียวกับไดเรกทอรีย่อย วิธีที่รวดเร็วในการแก้ไขปัญหานี้คือการผนวกตัวเลือก

-not -name .

ซึ่งหยุดค้นหาจากการส่งออกไดเรกทอรีปัจจุบันและในทางกลับกันจะหยุดการลบ

หากคุณใช้คำสั่งในไดเรกทอรีประมวลผลเพื่อให้สามารถใช้งานพา ธ สัมบูรณ์ได้:

-not -name /var/www/html/content/processing

และคำสั่งทั้งหมดจะเป็น:

find /var/www/html/content/processing -type d -mtime +1 -not -name /var/www/html/content/processing -exec rm -rf {} \;

คำสั่งสุดท้ายนั้นผิด -nameหมายถึงชื่อไฟล์มันไม่ตรงกับสิ่งใดด้วยเครื่องหมายสแลช -pathคุณอาจจำเป็นต้องใช้
Kamil Maciorowski

1

ตอบแล้วฉันยังต้องการแสดงรายการวิธีอื่น

find /var/www/html/content/processing -mindepth 1 -maxdepth 1 -type d

สิ่งนี้จะแยกไดเรกทอรียอดนิยม (และไดเรกทอรีย่อย) และตอนนี้คุณสามารถใช้คำสั่งใดก็ได้ที่เราต้องการนำไปใช้

>> ตัวเลือก:
-mindepth 1: การแยกไดเรกทอรีหลัก
-maxdepth 1: เพื่อหลีกเลี่ยงการแยกไดเรกทอรีย่อย (สำหรับสถานการณ์เฉพาะตามที่สงสัยคุณไม่จำเป็นต้องใช้สิ่งนี้)
-type d: แสดงรายการชนิดไดเร็กทอรีเท่านั้น ตัวเลือกนี้ควรมาหลังจาก mindepth maxdepth ใช้


ทำไม-maxdepth 1? ทำไม-type dสองครั้ง สิ่งนี้แตกต่างจากคำตอบที่ยอมรับอย่างไร
Attie

@Attie: ขอบคุณแก้ไขข้อผิดพลาด maxdepth ไม่จำเป็น แต่มันจะมีประโยชน์หากคุณต้องการหลีกเลี่ยงการแสดงรายการไดเรกทอรีย่อย
Prashant
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.