วิธีการค้นหาไฟล์และรูปภาพที่ถูกโยงถึงซึ่งไม่ได้เชื่อมโยงจากสไตล์ชีท css ใด ๆ หรือจากโหนดใด ๆ


21

มีวิธีในการแสดงรายการไฟล์ที่ไม่ได้ใช้ทั้งหมดซึ่งอยู่ในระบบไฟล์สาธารณะและในไดเรกทอรีธีมและรายการไฟล์เหล่านั้นหรืออาจมีตัวเลือกในการลบโดยอัตโนมัติ

ฉันหมายถึงไฟล์ที่ไม่ได้เชื่อมโยงจากสไตล์ชีท css ใด ๆ หรือจากโหนดใด ๆ


ฉันต้องการทราบคำตอบเช่นกันขอบคุณที่โพสต์คำถาม!
NPC

คุณอ้างถึงไฟล์ที่อัพโหลดด้วยฟิลด์ (เช่น ImageField) หรือไฟล์ทั่วไป (อัปโหลดผ่าน IMCE) หรือไม่ ฉันไม่คิดว่าคุณจะสามารถติดตามการอัปโหลด IMCE ได้โดยไม่ต้องค้นหาการอ้างอิงเนื้อหาแต่ละโหนด
Chaulky

ใช่ฉันกำลังอัปโหลดผ่าน IMCE ฉันหวังว่าจะมีโมดูลที่ทำในสิ่งที่คุณพูด: สแกนโหนดเพื่อค้นหาการอ้างอิงรูปภาพจากนั้นสำหรับการอ้างอิง drupal ภายใน (ไม่มีโดเมน) สแกนไดเรกทอรีที่เกี่ยวข้องและเปรียบเทียบทั้งสองเพื่อค้นหาไฟล์ที่ไม่ได้ใช้ บางทีอาจมีบางสิ่งที่คล้ายกันเกิดขึ้นกับลิงก์ในโมดูลที่มีอยู่เพื่อค้นหาลิงก์ที่เสียหาย ดังนั้นฉันคิดว่าอาจมีโมดูลที่คล้ายกันสำหรับรูปภาพ แต่อาจจะไม่ใช่ ..
camcam

คำตอบ:


14

คุณสามารถค้นหาไฟล์ที่ถูกโยงถึงโดยรันเคียวรี MySQL ต่อไปนี้:

SELECT fm.*
FROM file_managed AS fm
LEFT OUTER JOIN file_usage AS fu ON (fm.fid = fu.fid)
LEFT OUTER JOIN node AS n ON (fu.id = n.nid)
WHERE fu.type = 'node' AND n.nid IS NULL

ส่งคืนไฟล์ทั้งหมดที่ไม่มีโหนดที่เชื่อมโยง ฉันไม่แน่ใจว่าปลอดภัยหรือไม่ที่จะลบแถวและไฟล์ที่ส่งคืนอาจจะขึ้นอยู่กับการตั้งค่าโมดูลของคุณด้วย ใช้ความเสี่ยงของคุณเองเท่านั้น!

ที่มา: http://drupal.org/node/733258#comment-5582764


5
คุณอาจแชร์ลิงก์ไปยังโพสต์ดั้งเดิมที่คุณคัดลอกโพสต์ของคุณจาก ....... drupal.org/node/733258#comment-5582764ฉันคิดว่ามันผิดจรรยาบรรณไม่มากที่จะแสดงแหล่งที่มา
Sk8erPeter

ติดตามลิงค์ที่คุณโพสต์ไว้ด้านบนฉันคิดว่ารหัสในdrupal.org/node/733258#comment-7427898นั้นมีประโยชน์เพราะมันจะลบทั้งไฟล์ orphaned และรายการที่เกี่ยวข้องในฐานข้อมูล
Marcos Buarque

ที่จริงแล้ว @ Sk8erPeter เหมาะที่จะสรุปข้อมูลในคำตอบแล้วเชื่อมโยงกับมัน โดยเฉพาะอย่างยิ่งหากพวกเขามาจากแหล่งภายนอกของ Exchange Exchange
Christia

1
@ คริสเตียถ้าคุณอ่านโพสต์ต้นฉบับก่อนที่ฉันจะแก้ไข (ฉันใส่ลิงค์ลงในคำตอบ) คุณจะเห็นว่าดาวิดได้คัดลอกคำแสดงความคิดเห็นของคนอื่นด้วยคำพูดโดยไม่พูดถึงแหล่งที่มาของมัน นี่ถือเป็นการลอกเลียนแบบนี่คือสิ่งที่ความคิดเห็นของฉันเกี่ยวกับ :)
Sk8erPeter

คุณจะพบสิ่งนี้สร้างรหัสไฟล์ที่ซ้ำกันบางส่วนเพื่อหลีกเลี่ยงปัญหานั้นและเพิ่มจำนวนซ้ำที่ฉันเพิ่มกลุ่มด้วย SELECT fm. *, COUNT (*) จาก file_managed AS fm LEFT OUTER OINTER JOIN file_usage AS fu ON (fm.fid = fu.fid) โหนด OUTER LEFT O ซ้ายเป็น n ON (fu.id = n.nid) WHERE fu.type = 'node' AND n.nid เป็น NULL GROUP BY fm.fid;
คาเมรอน

5

สำหรับผู้ที่มาโพสต์นี้สามปีต่อมามีโมดูลเล็ก ๆ น้อย ๆ ที่คุณสามารถใช้ในการทำเช่นนี้เรียกว่าแฟนซีไฟล์ลบ

ในขณะที่โพสต์นี้เป็นรุ่นเบต้าดังนั้นคุณต้องยอมรับความเสี่ยงเอง และเช่นเคยการล้างสิ่งที่ไม่ได้ใช้งานผ่านการสืบค้นฐานข้อมูลนั้นสามารถทำให้เข้าใจได้และความสำเร็จนั้นขึ้นอยู่กับการตั้งค่าโมดูลของคุณ


ฉันพบว่าโมดูลนี้มีราคาแพงมาก - จนถึงจุดที่ไร้ประโยชน์ YMMV
เฟลิกซ์อีฟ

3

สิ่งที่อาจช่วยระบุ " ไฟล์ที่ไม่ได้เชื่อมต่อกับโหนดหรือไฟล์และไดเรกทอรีที่ไม่ได้อยู่ในตารางจัดการไฟล์ " อีกต่อไป (เช่นเดียวกับคำถามที่ซ้ำกันเกี่ยวกับ " วิธีการลบไฟล์ที่ไม่ได้ใช้ ") คือการใช้โมดูลตัวตรวจสอบไฟล์ รายละเอียดบางอย่างเกี่ยวกับเรื่องนี้จากหน้าโครงการ:

ในโลกแห่ง Drupal ที่สมบูรณ์แบบระบบไฟล์เซิร์ฟเวอร์ของคุณและรายการที่เกี่ยวข้องในตารางไฟล์ของ Drupal ได้รับการซิงโครไนซ์ 100% แต่ถ้าส่วนใดส่วนหนึ่งของระบบไฟล์ของคุณเกิดความเสียหายเนื่องจากความล้มเหลวของดิสก์ หรือหนึ่งในโมดูลของคุณทำให้ฐานข้อมูลและไฟล์ของคุณยุ่งเหยิง? หรือสคริปต์การปรับใช้ของคุณไปห้อมล้อม? ถ้าอย่างนั้นโมดูลนี้จะช่วยให้คุณตรวจสอบและค้นหาไฟล์ที่ไม่ซิงค์กัน

ออกจากกล่องตารางไฟล์มีสถานะสองประเภท: ชั่วคราว (0) และถาวร (1) ตัวตรวจสอบไฟล์แนะนำสถานะเพิ่มเติมที่ขาดหายไป (2) ในขอบเขตของกระบวนการตรวจสอบซึ่งสามารถทริกเกอร์ได้หลายวิธีคอลัมน์สถานะของตารางไฟล์จะถูกอัพเดท

คุณสมบัติ

  • เรียกใช้กระบวนการตรวจสอบ: ตามต้องการผ่าน cron ผ่าน drush (กำลังวางแผน)
  • หน้าภาพรวมรายการไฟล์พร้อมตัวกรอง
  • การรวมเข้าชม
  • คำสั่ง Drush สำหรับการตรวจสอบไฟล์

หากคุณต้องการส่งออกผลลัพธ์ของมุมมองแนะนำให้ใช้โมดูล views_data_export

ดังนั้นสิ่งที่คุณสามารถทำได้คือ:

  • คัดลอก (คัดลอก) ไซต์ของคุณไปยังสภาพแวดล้อม dev แต่อย่าคัดลอกไฟล์ใด ๆ ในไดเรกทอรีที่คุณต้องการตรวจสอบ ในรูปแบบที่หลากหลาย (หากคำถามนี้เกี่ยวกับไซต์สถานะที่ไม่ใช่การผลิต) เพียงแค่ย้ายไฟล์ทั้งหมดออกจากไดเรกทอรีนั้นชั่วคราว
  • ใช้โมดูลตัวตรวจสอบไฟล์เพื่อค้นหาไฟล์ที่ "หายไป": ไฟล์เหล่านี้เป็นไฟล์ที่ไม่ได้ใช้อย่างชัดเจน แต่ไฟล์ใด ๆ ที่โมดูลนี้ไม่โต้เถียงคือ ... ไม่ได้ใช้!
  • โดยการคัดลอกไฟล์ที่หายไปทั้งหมดไปยังตำแหน่งที่ถูกต้องของไดเรกทอรีที่คุณต้องการตรวจสอบจากนั้นสร้างเนื้อหาที่สมบูรณ์แบบในไดเรกทอรีของคุณทีละขั้นตอน

หมายเหตุ : แม้ว่าคำถามนี้จะเกี่ยวกับ D7 แต่เป็นรุ่น (อัลฟ่า) ของมันสำหรับ D8 ด้วย


แนวทางที่มีประโยชน์มากในการแก้ปัญหาของฉัน
kb8

2

มีหนึ่งโมดูลที่ลบไฟล์ที่ไม่พึงประสงค์ไฟล์แฟนซีเป็น

ดูไฟล์ที่มีการจัดการทั้งหมดพร้อมตัวเลือกเพื่อบังคับให้ลบไฟล์ผ่านการกระทำที่กำหนดเองของ VBO การลบไฟล์ที่มีการจัดการด้วยตนเองโดย FID (และตัวเลือกในการบังคับให้ลบหากคุณต้องการ) การลบไฟล์ที่ไม่ได้ใช้จากไดเรกทอรีไฟล์เริ่มต้นที่ไม่ได้อยู่ในตารางการจัดการไฟล์ AKA ลบไฟล์ที่ไม่มีการจัดการทั้งหมด การลบไฟล์ที่ไม่ได้ใช้จากการติดตั้งทั้งหมดที่ไม่ได้เชื่อมต่อกับโหนดและตารางการใช้ไฟล์ AKA ลบไฟล์ที่ถูกโยงถึงทั้งหมด


1
ฉันมีประสบการณ์ไม่ดีกับการทำงานขนาดใหญ่และโมดูล vbo เริ่มแรกฉันจะใช้วิธีการที่แนะนำโดย Pierre.Vriens หลังจากนั้นฉันจะใช้โมดูลแนะนำเพื่อรักษาความสะอาดไดเรกทอรีไฟล์
kb8

0

คุณสามารถลบไฟล์ที่ไม่ได้ใช้โดย

  1. ลบออกจากตารางfile_managedด้วยตนเองโดยใช้แบบสอบถามบางอย่างเช่น

    $this->database ->delete('file_managed') ->condition('fid', $fid, '=') ->execute();

  2. การตั้งค่าสถานะของไฟล์0เพื่อทำเครื่องหมายว่าเป็นไฟล์ชั่วคราวดังนั้น cron จะลบออกหลังจากระยะเวลาหนึ่ง
    $file = File::load ($fid); $file->setTemporary();


0

ลบไฟล์แฟนซีโมดูลไม่ได้ทำงานเลยสำหรับผม นี่คือทางเลือกเพิ่มเติมด้วยตนเอง

ในการลบไฟล์ออกจากโฟลเดอร์ที่ไม่ได้อยู่ในตารางไฟล์ที่มีการจัดการคุณสามารถ:

1) สร้างรายการของไฟล์ที่ถูกจัดการทั้งหมด:

mysql whateverdb -e "select filename from file_managed" > ~/managed-files.txt

2) ลบไฟล์ทั้งหมดจากไดเรกทอรีที่ไม่ได้อยู่ในรายการนั้น เมื่อต้องการทำสิ่งนี้ฉันใช้สคริปต์ทุบตีขนาดเล็ก:

#!/bin/bash

IMG_FOLDER='/var/www/html/yoursite/docroot/sites/default/files/certain-images'
EXCLUDES='/home/yourhomeuser/managed-files.txt'

for FILE in $IMG_FOLDER/*; do
  if ! grep "$FILE" "$EXCLUDES"; then
        echo "Deleting $FILE"
        rm -f "$FILE"
  fi
done

เพียงเปลี่ยนIMG_FOLDERตัวแปรเป็นพา ธ ของโฟลเดอร์ใดก็ตามที่คุณต้องการลบไฟล์ (และอัปเดตพา ธ เป็นไฟล์แยกของคุณ)

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