Ich frage mich, warum das nicht weiter diskutiert wird? Das ist wirklich ein großes Problem.
Ich habe ein PHP-Skript geschrieben, das eine CSV-Datei verwendet, die aus der folgenden SQL-Abfrage generiert wird und alle Uploads und ihre Referenzen auflistet:
(Erhöhen Sie das Limit, wenn Sie viele Uploads haben)
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
Was das Skript nun tut, ist, dass es Uploads filtert, die nur als Entwürfe verbleiben (was fälschlicherweise in der Datenbank verbleibt, wie ich hier erklärt habe). Das Skript gibt einen durch Leerzeichen getrennten String mit allen Dateinamen aus. Sie können das Skript auch ändern, um den vollständigen Pfad auszugeben (entfernen Sie die Funktion basename()).
Melden Sie sich dann bei Ihrem Discourse SSH-Server an und führen Sie den rm-Befehl für alle Dateien aus.
- Ein Nachteil ist, dass alle Bilder, die in aktiven Entwürfen verbleiben, ebenfalls gelöscht werden (dies kann jedoch durch Senken von Entwürfe älter als n Tage löschen begrenzt werden).
- Zweiter Nachteil - die fehlerhaften Datenbankeinträge bleiben bestehen, dafür müsste ich die Entwickler um eine Korrektur bitten.
Wenn die fehlerhaften Einträge gelöscht werden, sollte das Problem ordnungsgemäß behoben sein.
<?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)." ";
}
?>
Die Datei test.csv, die die Abfrage enthält, sollte im selben Verzeichnis wie das Skript platziert werden.
Wenn Sie Probleme haben, fragen Sie mich!