ฉันไปเพื่อวิธีที่ปลอดภัยกว่าและเร็วกว่ามากเพราะฉันมีไฟล์ 18,000 ไฟล์ในรายการ! ฉันต้องล้างรูปภาพในการติดตั้ง Drupal ขนาดใหญ่
การลบไฟล์ทั้งหมดที่ไม่อยู่ในรายการจะเหมือนกับการเก็บเฉพาะไฟล์ที่อยู่ในรายการ ดังนั้นฉันจึงตัดสินใจที่จะคัดลอกไฟล์จากรายการไปยังตำแหน่งอื่น แต่การคัดลอกไฟล์ 20 GB จะใช้พื้นที่มากเกินไปและช้ามากเช่นกัน ดังนั้นเคล็ดลับคือการคัดลอกไฟล์เป็นhardlinks
แทนโดยใช้ตัวเลือกในการ-l
cp
ใช้พื้นที่เกือบจะไม่มีและรวดเร็วมาก นอกจากนี้เนื่องจากฉันต้องการรักษาโครงสร้างไดเรกทอรีฉันจึงใช้--parents
ตัวเลือก
นี่คือข้อความที่ตัดตอนมาจากรายการไฟล์ของฉัน:
1px.png
misc/feed.png
modules/file/icons/x-office-presentation.png
modules/file/icons/x-office-spreadsheet.png
newsletter.png
sites/all/libraries/ckeditor/plugins/smiley/images/devil_smile.png
sites/all/libraries/ckeditor/plugins/smiley/images/regular_smile.png
sites/default/files/009313_PwC_banner_CBS_Observer_180x246px.jpg
ดังนั้นตัวอย่างจะเป็นโดยที่ temp เป็นปลายทาง:
cp -l --parents 'misc/feed.png' temp
สิ่งนี้จะสร้างโครงสร้างนี้:
temp
misc
feed.png
โปรดทราบว่า destinaton จะต้องอยู่ในระบบไฟล์เดียวกันกับแหล่งข้อมูลเพื่อให้ฮาร์ดลิงก์ทำงานได้
ขั้นตอนต่อไปคือการสร้างสคริปต์:
sed -e "s,^,cp -l --parents '," -e "s,$,' /some/where/temp," filelist > newfilelist
ทีนี้สมมุติว่าคุณสร้าง dir ที่ว่างเปล่า / บาง / ที่ไหน / temp แล้วคุณสามารถคัดลอกไฟล์แบบนี้:
sh newfilelist 2> missing_files
missing_files
หมายเหตุว่าข้อผิดพลาดจบลงใน โบนัสเพิ่มเติมของวิธีนี้คือคุณจะได้รับรายชื่อไฟล์จากรายการดั้งเดิมที่ไม่มีอยู่จริง!
หลังจากรันสคริปต์แล้ว temp จะมีเฉพาะไฟล์ที่อยู่ในรายการไฟล์ แต่ไม่ต้องลบอะไรเลยและไม่ต้องใช้พื้นที่เพิ่มเติม หากคุณพอใจกับผลลัพธ์คุณสามารถลบไฟล์เดิมทั้งหมดรวมถึงโฟลเดอร์ย่อย
ในที่สุดย้ายไฟล์และโฟลเดอร์จาก temp กลับไปที่ตำแหน่งเดิม
สำหรับไฟล์ 18,000 ไฟล์ใช้เวลาเพียงไม่กี่วินาที