Bagaimana menemukan file dan gambar yatim yang tidak ditautkan dari stylesheet css atau dari simpul apa pun?

21

Apakah ada cara untuk membuat daftar semua file yang tidak digunakan yang berada di dalam sistem file publik dan di dalam direktori tema dan mendaftarkannya, atau mungkin bahkan memiliki opsi untuk menghapusnya secara otomatis?

Maksud saya file yang saat ini tidak ditautkan dari stylesheet css atau dari node apa pun.

camcam
sumber
Saya juga ingin tahu jawabannya, terima kasih sudah mengirim pertanyaan!
NPC
Apakah Anda merujuk ke file yang diunggah dengan Field (seperti ImageField) atau file secara umum (diunggah melalui IMCE)? Saya tidak berpikir Anda dapat melacak unggahan IMCE tanpa mencari referensi setiap referensi.
Chaulky
Ya, saya mengunggah melalui IMCE. Saya berharap ada modul yang melakukan apa yang Anda katakan: memindai node untuk menemukan referensi gambar, kemudian untuk referensi drupal internal (tanpa domain) memindai direktori yang relevan dan membandingkan keduanya untuk menemukan file yang tidak digunakan. Mungkin sesuatu yang serupa dilakukan dengan tautan dalam modul yang ada untuk menemukan tautan yang rusak. Jadi saya pikir mungkin modul serupa ada untuk gambar tetapi mungkin tidak ..
camcam

Jawaban:

14

Anda dapat menemukan file yatim dengan menjalankan kueri MySQL berikut:

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

Ini mengembalikan semua file yang tidak memiliki simpul terkait. Saya tidak yakin apakah aman untuk menghapus baris dan file yang dikembalikan, mungkin juga tergantung pada pengaturan modul Anda. Gunakan hanya dengan risiko Anda sendiri!

Sumber: http://drupal.org/node/733258#comment-5582764

David Carter
sumber
5
Anda dapat membagikan tautan ke pos ASLI yang Anda COPI dari pos Anda ....... drupal.org/node/733258#comment-5582764 Saya pikir sangat tidak etis untuk tidak menunjukkan sumbernya.
Sk8erPeter
Mengikuti tautan yang telah Anda posting di atas, saya juga berpikir kode di drupal.org/node/733258#comment-7427898 berguna karena akan menghapus file yatim dan entri terkait dalam database.
Marcos Buarque
Sebenarnya, @ Sk8erPeter, sudah sepantasnya untuk meringkas informasi dalam jawaban dan kemudian menautkannya. Terutama jika mereka berasal dari sumber di luar Stack Exchange.
Christia
1
@Christia, jika Anda membaca posting asli sebelum saya mengeditnya (saya masukkan tautannya ke jawaban), Anda dapat melihat bahwa David telah menyalin komentar orang lain kata demi kata tanpa menyebutkan sumbernya dan meletakkan tanda kutip di sekitar posting. Ini dapat dianggap sebagai plagiarisme, inilah komentar saya. :)
Sk8erPeter
Anda akan menemukan ini menghasilkan beberapa id file duplikat, untuk menghindarinya dan menambahkan jumlah duplikat yang saya tambahkan grup. SELECT fm. *, COUNT (*) DARI file_managed AS fm LEFT OUTER JOIN file_usage AS fu ON (fm.fid = fu.fid) LEFT OUTER JOIN simpul AS n ON (fu.id = n.nid) WHERE fu.type = 'node' AND n.nid ADALAH KELOMPOK NULL OLEH fm.fid;
Cameron
5

Bagi mereka yang datang ke posting ini tiga tahun kemudian, ada modul kecil yang dapat Anda gunakan untuk melakukan ini yang disebut Fancy File Delete .

Pada saat posting ini, ini masih dalam versi beta, jadi gunakan dengan risiko Anda sendiri. Seperti biasa, membersihkan apa pun yang yatim melalui kueri DB dapat menjadi samar dan keberhasilannya sangat bergantung pada pengaturan modul khusus Anda.

joe_flash
sumber
Saya menemukan modul ini sangat buggy - ke titik di mana itu tidak berguna. ymmv.
Felix Eve
3

Sesuatu yang dapat membantu mengidentifikasi " file yang tidak lagi dilampirkan ke node atau file dan direktori yang tidak ada dalam tabel file yang dikelola " (seperti dalam pertanyaan duplikat tentang " Bagaimana cara menghapus file yang tidak digunakan? "), Adalah menggunakan Modul Pemeriksa File . Beberapa perincian tentang itu, dari halaman proyeknya:

Dalam dunia Drupal yang sempurna, sistem file server Anda dan entri yang sesuai di tabel file Drupal disinkronisasi 100%. Tetapi bagaimana jika bagian dari sistem file Anda telah rusak karena beberapa kegagalan disk? Atau salah satu modul Anda mengacaukan database dan file Anda? Atau skrip deploy Anda menjadi beserk? Nah, maka modul ini akan membantu Anda untuk memantau dan mencari tahu file mana yang tidak sinkron.

Di luar kotak tabel file memiliki dua jenis status: Sementara (0) dan Permanen (1). Pemeriksa file memperkenalkan status tambahan Tidak Ada (2). Dalam lingkup proses verifikasi yang dapat dipicu dengan berbagai cara, kolom status dari tabel file diperbarui.

fitur

  • Jalankan proses verifikasi: sesuai permintaan, melalui cron, melalui drush (dalam perencanaan)
  • Halaman ikhtisar daftar file dengan filter
  • Integrasi tampilan
  • Perintah drush untuk memeriksa file

Jika Anda ingin mengekspor hasil tampilan, disarankan untuk menggunakan modul views_data_export.

Jadi yang bisa Anda lakukan adalah seperti:

  • Klon (salin) situs Anda ke beberapa lingkungan dev, tetapi jangan menyalin salah satu file di direktori yang ingin Anda periksa. Sebagai variasi (jika pertanyaan ini tentang situs status non-produksi), cukup pindahkan semua file keluar dari direktori itu untuk sementara.
  • Gunakan modul Pemeriksa File untuk mencari tahu file apa yang "hilang": ini adalah file yang jelas tidak terpakai. Tetapi file apa pun yang tidak diperdebatkan modul ini adalah ... tidak digunakan!
  • Dengan menyalin semua file yang hilang ke lokasi yang benar dari direktori yang ingin Anda periksa, Anda kemudian selangkah demi selangkah membuat ulang konten yang sempurna dari direktori Anda.

Catatan : meskipun pertanyaan ini tentang D7, itu adalah versi (alfa) dari itu juga untuk D8.

Pierre
sumber
Pendekatan yang sangat membantu untuk menyelesaikan masalah saya
kb8
2

ada satu modul yang menghapus file yang tidak diinginkan menghapus file mewah .

Lihat semua file yang dikelola dengan opsi untuk menghapusnya secara paksa melalui tindakan khusus VBO Secara manual menghapus file yang dikelola oleh FID (dan opsi untuk memaksa penghapusan jika Anda benar-benar ingin). Menghapus file yang tidak digunakan dari direktori file default yang tidak ada dalam tabel file yang dikelola. AKA menghapus semua file yang tidak dikelola. Menghapus file yang tidak digunakan dari seluruh instal yang tidak lagi dilampirkan ke node & tabel penggunaan file. AKA menghapus semua file yatim.

vgoradiya
sumber
1
Saya memiliki pengalaman buruk dengan operasi besar besar-besaran dan modul vbo. Awalnya saya akan menggunakan pendekatan seperti yang disarankan oleh Pierre.Vriens, setelah saya akan menggunakan modul saran Anda untuk menjaga membersihkan direktori file.
kb8
0

Anda dapat menghapus file yang tidak digunakan oleh

  1. Hapus secara manual dari tabel file_managed , oleh beberapa permintaan seperti

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

  2. Pengaturan status file 0 , untuk menandai adalah sebagai file sementara, sehingga cron akan menghapusnya setelah waktu tertentu.
    $file = File::load ($fid); $file->setTemporary();

Jasodeep Chatterjee
sumber
0

The File mewah hapus modul tidak bekerja sama sekali bagi saya. Berikut ini adalah alternatif yang lebih manual.

Untuk menghapus file dari folder yang tidak ada dalam tabel file yang dikelola, Anda dapat:

1) Buat daftar semua file yang dikelola:

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

2) Hapus semua file dari direktori yang tidak ada dalam daftar itu. Untuk melakukan ini, saya menggunakan skrip bash kecil:

#!/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

Cukup ubah IMG_FOLDERvariabel ke jalur folder apa pun yang Anda ingin hapus filenya (dan perbarui jalur ke file yang tidak termasuk Anda)

Felix Eve
sumber