¿Cómo encontrar archivos e imágenes huérfanos que no están vinculados desde ninguna hoja de estilo CSS o desde cualquier nodo?

21

¿Hay alguna manera de enumerar todos los archivos no utilizados que residen dentro del sistema de archivos públicos y dentro de un directorio de temas y enumerarlos, o tal vez incluso tener una opción para eliminarlos automáticamente?

Me refiero a los archivos que actualmente no están vinculados desde ninguna hoja de estilo CSS o desde cualquier nodo.

camcam
fuente
Me gustaría saber la respuesta a eso también, ¡gracias por publicar la pregunta!
NPC
¿Se refiere a archivos cargados con un campo (como ImageField) o archivos en general (cargados a través de IMCE)? No creo que pueda rastrear las cargas IMCE sin buscar referencias en cada cuerpo de nodo.
Chaulky
Sí, estoy cargando a través de IMCE. Esperaba que haya un módulo que haga lo que usted dijo: escanee nodos para encontrar referencias de imágenes, luego, para referencias internas de drupal (sin dominio) escanee directorios relevantes y compare ambos para encontrar archivos no utilizados. Quizás se haga algo similar con enlaces en un módulo existente para encontrar enlaces rotos. Así que pensé que tal vez exista módulo similar para las imágenes, pero quizás no ..
CamCam

Respuestas:

14

Puede encontrar archivos huérfanos ejecutando la siguiente consulta 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

Esto devuelve todos los archivos que no tienen un nodo asociado. No estoy seguro de si es seguro eliminar las filas y archivos devueltos, probablemente también depende de la configuración de su módulo. ¡Úselo bajo su propio riesgo!

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

David Carter
fuente
55
Podría haber compartido el enlace a la publicación ORIGINAL en la que COPIÓ su publicación de ....... drupal.org/node/733258#comment-5582764 Creo que es muy poco ético no mostrar la fuente.
Sk8erPeter
Siguiendo el enlace que ha publicado anteriormente, también creo que el código en drupal.org/node/733258#comment-7427898 es útil porque eliminará los archivos huérfanos y sus entradas correspondientes en la base de datos.
Marcos Buarque
En realidad, @ Sk8erPeter, es apropiado resumir la información en las respuestas y luego vincularla. Especialmente si provienen de una fuente fuera de Stack Exchange.
Christia
1
@Christia, si lees la publicación original antes de editarla (pongo el enlace en la respuesta), puedes ver que David ha copiado el comentario de otra persona palabra por palabra sin siquiera mencionar su fuente y poner un signo de cita alrededor de la publicación. Esto se puede considerar como plagio, de eso se trataba mi comentario. :)
Sk8erPeter
Verás que esto produce algunos identificadores de archivos duplicados, para evitar eso y agregar un recuento de los duplicados por los que agregué un grupo. SELECCIONE fm. *, COUNT (*) DESDE file_managed AS fm IZQUIERDA EXTERIOR UNIR file_usage AS fu ON (fm.fid = fu.fid) IZQUIERDA EXTERIOR UNIR AS nodo n ON (fu.id = n.nid) DONDE fu.type = 'nodo' Y n.nid ES GRUPO NULO POR fm.fid;
Cameron
5

Para aquellos que vienen a esta publicación tres años después, hay un pequeño módulo que puedes usar para hacer esto llamado Eliminar archivos de lujo .

En el momento de esta publicación, está en versión beta, así que úselo bajo su propio riesgo. Como siempre, limpiar cualquier cosa huérfana a través de consultas DB puede ser incompleto y su éxito depende en gran medida de la configuración particular de su módulo.

joe_flash
fuente
Este módulo me pareció muy defectuoso, hasta el punto de que era inútil. ymmv.
Felix Eve
3

Algo que puede ayudar a identificar " archivos que ya no están conectados a nodos o archivos y directorios que no están en la tabla administrada de archivos " (como en la pregunta duplicada sobre " ¿Cómo eliminar archivos no utilizados? "), Es usar el Módulo Comprobador de archivos . Algunos detalles al respecto, desde su página de proyecto:

En un mundo perfecto de Drupal, su sistema de archivos del servidor y sus entradas correspondientes en la tabla de archivos de Drupal están 100% sincronizados. Pero, ¿qué pasa si partes de su sistema de archivos se han dañado debido a alguna falla en el disco? ¿O uno de sus módulos estropeó su base de datos y archivos? ¿O su script de despliegue se volvió loco? Bueno, entonces este módulo lo ayudará a monitorear y descubrir qué archivos no están sincronizados.

Fuera de la caja, la tabla de archivos tiene dos tipos de estados: Temporal (0) y Permanente (1). El verificador de archivos presenta un estado adicional Falta (2). En el alcance del proceso de verificación que se puede activar de varias maneras, se actualiza la columna de estado de la tabla de archivos.

Caracteristicas

  • Ejecute el proceso de verificación: bajo demanda, a través de cron, a través de drush (en planificación)
  • Página de resumen de la lista de archivos con filtros
  • Integración de vistas
  • Comando drush para verificar archivos

Si desea exportar los resultados de una vista, se recomienda utilizar el módulo views_data_export.

Entonces, lo que podrías hacer es así:

  • Clone (copie) su sitio en un entorno de desarrollo, pero no copie ninguno de los archivos en el directorio que desea verificar. Como una variación (si esta pregunta es sobre un sitio de estado de no producción), simplemente mueva temporalmente todos los archivos fuera de ese directorio.
  • Use el módulo Comprobador de archivos para averiguar qué archivos "faltan": estos son los archivos que obviamente no se utilizan. Pero cualquier archivo sobre el que este módulo no discuta está ... ¡sin usar!
  • Al copiar todos los archivos que faltan en la ubicación correcta del directorio que desea verificar, luego, paso a paso, recrea un contenido perfecto de su directorio.

Nota : aunque esta pregunta es sobre D7, también es una versión (alfa) para D8.

Pierre.Vriens
fuente
Enfoque muy útil para resolver mi problema
kb8
2

hay un módulo que elimina archivos no deseados archivo de fantasía borrar .

Vista de todos los archivos administrados con una opción para forzar su eliminación a través de acciones personalizadas de VBO Eliminación manual de archivos administrados por FID (y una opción para forzar la eliminación si realmente lo desea). Eliminar archivos no utilizados del directorio de archivos predeterminado que no están en la tabla administrada de archivos. También conocido como eliminar todos los archivos no administrados. Eliminar archivos no utilizados de toda la instalación que ya no están adjuntos a los nodos y la tabla de uso de archivos. También conocido como eliminar todos los archivos huérfanos.

vgoradiya
fuente
1
Tengo una mala experiencia con grandes operaciones masivas y módulo vbo. Inicialmente usaré un enfoque como el sugerido por Pierre.Vriens, luego usaré su módulo de sugerencias para mantener limpio el directorio de archivos.
kb8
0

Puede eliminar el archivo no utilizado por

  1. Eliminar manualmente de la tabla file_managed , mediante alguna consulta como

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

  2. Establecer el estado de un archivo 0 , para marcar es como archivo temporal, por lo que el cron lo eliminará después de cierto tiempo.
    $file = File::load ($fid); $file->setTemporary();

Jasodeep Chatterjee
fuente
0

El elegante módulo de eliminación de archivos no funcionó en absoluto para mí. Aquí hay una alternativa más manual.

Para eliminar archivos de una carpeta que no está en la tabla de archivos administrados, puede:

1) Cree una lista de todos los archivos administrados:

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

2) Eliminar todos los archivos de un directorio que no están en esa lista. Para hacer esto, utilicé un pequeño script bash:

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

Simplemente cambie la IMG_FOLDERvariable a la ruta de la carpeta de la que desea eliminar archivos (y actualice la ruta a su archivo de exclusión)

Víspera de felix
fuente