CSSスタイルシートまたはノードからリンクされていない孤立したファイルとイメージを見つける方法


21

パブリックファイルシステム内およびテーマディレクトリ内にあるすべての未使用ファイルを一覧表示してそれらを一覧表示する方法はありますか、あるいはそれらを自動的に削除するオプションがありますか?

現在、CSSスタイルシートまたはノードからリンクされていないファイルを意味します。


私もその答えを知りたいです。質問を投稿してくれてありがとう!
NPC

Field(ImageFieldなど)でアップロードされたファイル、または一般的なファイル(IMCEでアップロードされたファイル)を参照していますか?各ノード本体で参照を検索せずにIMCEアップロードを追跡できるとは思いません。
-Chaulky

はい、IMCE経由でアップロードしています。私はあなたが言ったことをするモジュールがあることを望んでいました:イメージ参照を見つけるためにノードをスキャンし、次に内部ドメイン(ドメインなし)参照のために関連ディレクトリをスキャンし、両方を比較して未使用ファイルを見つけます。おそらく、壊れたリンクを見つけるために既存のモジュール内のリンクを使用して同様のことが行われます。だから、画像用に似たようなモジュールが存在するかもしれないが、そうでないかもしれないと
思った

回答:


14

次の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

これにより、関連付けられたノードがないすべてのファイルが返されます。返された行とファイルを削除しても安全かどうかはわかりませんが、おそらくモジュールのセットアップにも依存します。ご自身の責任でのみ使用してください!

ソース:http : //drupal.org/node/733258#comment-5582764


5
投稿をコピーした元の投稿へのリンクを共有できたかもしれません。...... drupal.org/node/733258#comment-5582764ソースを表示しないことは非常に非倫理的だと思います。
Sk8erPeter

上記のリンクをたどると、drupal.org / node / 733258#comment-7427898のコードは、孤立ファイルとデータベース内の対応するエントリの両方を削除するので便利だと思います。
マルコスBuarque

実際、@ Sk8erPeter、回答の情報をまとめてリンクするのが適切です。特に、Stack Exchange以外のソースからの場合。
クリスティ

1
@Christia、編集する前に元の投稿を読んだ場合(リンクを回答に追加しました)、Davidが他の人のコメントを単語ごとにコピーしたことがわかります。これは盗作と見なすことができます。これが私のコメントの目的です。:)
Sk8erPeter

これを回避し、グループを追加した重複の数を追加するために、これにより重複したファイルIDが生成されることがわかります。SELECT fm。*、COUNT(*)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はNULL GROUP BY fm.fidです;
キャメロン

5

3年後にこの投稿にアクセスする人のために、これを行うために使用できるFancy File Deleteという小さなモジュールがあります。

この投稿の時点では、ベータ版であるため、自己責任で使用してください。いつものように、DBクエリを使用して孤立したものをクリーンアップすることは大雑把であり、その成功は特定のモジュール設定に大きく依存します。


このモジュールは非常にバグが多いことがわかりました-役に立たないところまで。ymmv。
フェリックスイブ

3

ノードに接続されていないファイルや、ファイル管理テーブルにないファイルやディレクトリ」を特定するのに役立つ可能性のあるもの(「未使用ファイルを削除する方法」に関する重複した質問のように)は、ファイルチェッカーモジュール。プロジェクトページからの詳細:

完璧なDrupalの世界では、サーバーファイルシステムとDrupalのファイルテーブル内の対応するエントリは100%同期されています。しかし、ディスク障害が原因でファイルシステムの一部が破損した場合はどうでしょうか?または、モジュールの1つがデータベースとファイルを台無しにしましたか?または、展開スクリプトが激しくなりましたか?さて、このモジュールは、どのファイルが同期していないかを監視して見つけるのに役立ちます。

すぐに使用できるファイルテーブルには、一時(0)と永続(1)の2種類のステータスがあります。ファイルチェッカーは、追加のステータスMissing(2)を導入します。さまざまな方法でトリガーできる検証プロセスの範囲で、ファイルテーブルのステータス列が更新されます。

特徴

  • 検証プロセスの実行:オンデマンド、cron経由、drush経由(計画中)
  • フィルター付きのファイルリストの概要ページ
  • ビューの統合
  • ファイルチェック用のDrushコマンド

ビューの結果をエクスポートする場合は、views_data_exportモジュールを使用することをお勧めします。

だからあなたができることは次のようなものです:

  • サイトをいくつかの開発環境にクローン(コピー)しますが、確認するディレクトリ内のファイルはコピーしないでください。バリエーションとして(この質問が非実稼働ステータスサイトに関するものである場合)、すべてのファイルをそのディレクトリから一時的に移動するだけです。
  • File Checkerモジュールを使用して、どのファイルが「欠落」しているかを調べます。これらは明らかに未使用ではないファイルです。しかし、このモジュールが議論していないファイルは...未使用です!
  • 不足しているすべてのファイルをチェックするディレクトリの正しい場所にコピーすることにより、ディレクトリの完全なコンテンツを段階的に再作成します。

:この質問はD7についてですが、これはD8でも(アルファ版)です。


私の問題を解決するための非常に有用なアプローチ
-kb8

2

不要なファイルを削除するモジュールが1つあります。

VBOカスタムアクションを介して強制的に削除するオプションを備えたすべての管理対象ファイルの表示FIDによって管理対象ファイルを手動で削除する(および必要に応じて強制的に削除するオプション)ファイル管理テーブルにない未使用のファイルをデフォルトのファイルディレクトリから削除します。別名ですべてのアンマネージドファイルを削除します。ノードとファイル使用量テーブルに添付されなくなった未使用ファイルをインストール全体から削除します。別名ですべての孤立ファイルを削除します。


1
大規模な大規模な操作とvboモジュールの悪い経験があります。提案モジュールを使用してファイルディレクトリをクリーンに維持した後、最初にPierre.Vriensによって提案されたようなアプローチを使用します。
kb8

0

使用していないファイルを削除するには

  1. 次のようなクエリにより、file_managedテーブルから手動で削除します。

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

  2. ファイル0のステータスをマークするように設定すると、一時ファイルとしてマークされるため、cronは特定の時間後にファイルを削除します。
    $file = File::load ($fid); $file->setTemporary();


0

派手なファイル削除モジュールは、私にとってまったく動作しませんでした。より手動による代替方法を次に示します。

管理されたファイルテーブルにないフォルダーからファイルを削除するには、次の方法があります。

1)すべての管理対象ファイルのリストを作成します。

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

2)そのリストにないディレクトリからすべてのファイルを削除します。これを行うには、小さな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

IMG_FOLDERファイルを削除するフォルダーのパスに変数を変更するだけです(そして、除外ファイルへのパスを更新します)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.