¿Por qué no se discute esto más ampliamente? Este es realmente un gran problema.
He escrito un script PHP que utiliza un archivo CSV generado a partir de la siguiente consulta SQL, que enumera todas las cargas y sus referencias:
(aumente el límite si tiene muchas cargas)
SELECT
uploads.original_filename,
ROUND(uploads.filesize / 1000000.0, 2) AS size_in_mb,
uploads.extension,
uploads.created_at,
uploads.url,
upload_references.upload_id,
upload_references.target_id,
upload_references.target_type,
upload_references.created_at,
upload_references.updated_at
FROM upload_references
JOIN uploads ON uploads.id = upload_references.upload_id
ORDER BY upload_references.target_type
LIMIT 90000
Ahora, lo que hace el script es filtrar las cargas que permanecen solo como borradores (que falsamente permanecen en la base de datos como expliqué aquí). El script genera una cadena separada por espacios con todos los nombres de archivo. También puede modificar el script para generar la ruta completa (elimine la función basename()).
Luego, inicie sesión en su servidor SSH de Discourse y ejecute el comando rm para todos los archivos.
- Una desventaja de esto es que todas las imágenes que permanecen en borradores activos también se eliminarán (pero esto se puede limitar reduciendo eliminar borradores de más de n días).
- Segunda desventaja: las entradas incorrectas de la base de datos aún permanecen, para eso debería pedir una solución a los desarrolladores.
Si se eliminan las entradas incorrectas, el problema debería solucionarse correctamente.
<?php
if (($open = fopen("test.csv", "r")) !== false) {
while (($data = fgetcsv($open, 100000, ",")) !== false) {
$array[] = $data;
}
fclose($open);
}
$final = array();
$i=0;
foreach ($array as $item){
if($item[7]=="Draft"){
foreach ($array as $item_inside){
if(($item_inside[4]==$item[4]) && ($item_inside[7]!="Draft")) $i++; //taisa i++, kad nav tikai drafts
}
if($i==0)array_push($final, $item[4]); //bija tikai drafti, var likt masiivaa
$i=0;
}
}
$final_unique= array_unique($final);
//print_r($final_unique);
foreach($final_unique as $single){
echo basename($single)." ";
}
?>
El archivo test.csv que contiene la consulta debe colocarse en el mismo directorio que el script.
Si tiene algún problema, ¡pregúnteme!