なぜこれがもっと広く議論されないのか不思議です。これは本当に大きな問題です。
以下のSQLクエリから生成されたCSVファイルを使用するPHPスクリプトを作成しました。これは、すべてのアップロードとその参照をリストします。
(アップロードが多い場合は、制限を増やしてください)
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
このスクリプトは、下書きとしてのみ残っているアップロードをフィルタリングします(これは、こちらで説明したように、データベースに誤って残っています)。スクリプトは、すべてのファイル名のスペース区切りの文字列を出力します。スクリプトを変更して、完全なパスを出力することもできます(basename()関数を削除します)。
次に、DiscourseのSSHサーバーにログインし、すべてのファイルに対してrmコマンドを実行します。
- これの1つの欠点は、アクティブな下書きに残っているすべての画像も削除されることです(ただし、これはn日より古い下書きを削除するを低くすることで制限できます)。
- 2つ目の欠点は、誤ったデータベースエントリがまだ残っていることです。これについては、開発者に修正を依頼する必要があります。
誤ったエントリが削除されれば、問題は適切に修正されるはずです。
<?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)." ";
}
?>
クエリを含むファイルtest.csvは、スクリプトと同じディレクトリに配置する必要があります。
何か問題があれば、私に聞いてください!