Linux で同じ内容のファイルを識別する方法の詳細な説明

Linux で同じ内容のファイルを識別する方法の詳細な説明

序文

ファイルのコピーによってハードドライブのスペースが大量に浪費され、ファイルを更新するときに混乱が生じることがあります。これらのファイルを識別するための 6 つのコマンドを次に示します。

最近の投稿では、ハードリンクされたファイル(つまり、同じハードディスクの内容を参照し、inode を共有するファイル)を識別して見つける方法について説明しました。この記事では、同じ内容だが相互にリンクされていないファイルを検索できるコマンドについて説明します。

ハード リンクは、ハード ドライブの追加のスペースを占有することなく、ファイル システム内の複数の場所にファイルを保存できるため便利です。一方、ファイルのコピーはハードドライブのスペースを大量に浪費することがあり、ファイルを更新するときに不便を引き起こす可能性があります。この記事では、これらのファイルを識別するいくつかの方法について説明します。

diffコマンドでファイルを比較する

おそらく、2 つのファイルを比較する最も簡単な方法は、 diff コマンドを使用することです。出力にはファイル間の違いが表示されます。 < および > 記号は、引数として渡された最初のファイル ( < ) または 2 番目のファイル ( > ) に追加のテキスト行があるかどうかを示します。この例では、backup.html に余分なテキスト行があります。

$ diff index.html バックアップ.html
2438a2439,2441
> <前>
> 報告は以上です。
> </pre>

diff が出力しない場合は、2 つのファイルは同一です。

$ diff ホーム.html インデックス.html
$

diff の唯一の欠点は、一度に 2 つのファイルしか比較できず、比較するファイルを指定する必要があることです。この記事のコマンドの中には、複数の重複ファイルを検出できるものもあります。

チェックサムの使用

cksum (チェックサム) コマンドは、ファイルのチェックサムを計算します。チェックサムは、テキスト コンテンツを長い数値 (例: 2819078353 228029) に変換する数学的な簡略化です。チェックサムは完全に一意ではありませんが、異なる内容のファイルが同じチェックサムを持つ可能性は極めて低くなります。

$ cksum *.html
2819078353 228029 バックアップ.html
4073570409 227985 ホーム.html
4073570409 227985 インデックス.html

上記の例では、同じチェックサムを生成する 2 番目と 3 番目のファイルが同一であると想定できることがわかります。

findコマンドの使用

find コマンドには重複ファイルを検索するオプションはありませんが、名前またはタイプでファイルを検索し、cksum コマンドを実行することは可能です。例えば:

$ find . -name "*.html" -exec cksum {} \;
4073570409 227985 ./home.html
2819078353 228029 ./backup.html
4073570409 227985 ./index.html

fslintコマンドの使用

fslint コマンドは、重複ファイルを見つけるために特に使用できます。開始位置を指定していることに注目してください。多数のファイルを反復処理する必要がある場合、完了するまでに時間がかかることがあります。重複したファイルをリストし、空のディレクトリや不正な ID などの他の問題を探す方法に注目してください。

$ fslint 。
-----------------------------------ファイル名 lint
-------------------------------無効なutf8名
-----------------------------------ファイルケース lint
----------------------------------重複ファイル <==
ホーム
インデックス.html
-----------------------------------ぶら下がっているリンク
--------------------リンク内の冗長な文字
------------------------------------疑わしいリンク
--------------------------------空のディレクトリ
./.gnupg
----------------------------------一時ファイル
----------------------重複/競合する名前
------------------------------------------不正なID
-------------------------ストリップされていない実行ファイル

システムに fslint をインストールする必要がある場合があります。コマンド検索パスに追加する必要がある場合もあります:

$ エクスポート PATH=$PATH:/usr/share/fslint/fslint

rdfindコマンドの使用

rdfind コマンドは重複した (同じ内容の) ファイルも検索します。その名前は「重複ファイルファインダー」を意味し、ファイルの日付に基づいてどのファイルがオリジナルであるかを判断できます。これは、新しいファイルが削除されるため、コピーを削除することを選択した場合に便利です。

$ rdfind ~
現在「/home/shark」をスキャン中、12 個のファイルが見つかりました。
現在、合計 12 個のファイルがあります。
デバイスと i ノードが一意でないため、1 つのファイルを削除しました。
合計サイズは699498バイトまたは683 KiBです
サイズが固有であるため、リストから 9 つのファイルを削除しました。残り 2 つのファイル。
最初のバイトに基づいて候補を除外しています: リストから 0 個のファイルを削除しました。残り 2 個のファイルです。
最後のバイトに基づいて候補を除外しています: リストから 0 個のファイルを削除しました。残り 2 個のファイルです。
sha1 チェックサムに基づいて候補を除外しています: リストから 0 個のファイルを削除しました。残り 2 個のファイルです。
2つのファイルが重複しているようです
合計で 223 KiB 削減できます。
結果ファイル results.txt を作成中です

このコマンドは dryrun モードで実行できます (つまり、それ以外の場合に行われる可能性のある変更のみを報告します)。

$ rdfind -dryrun は true です ~
(DRYRUN モード) 現在、「/home/shark」をスキャンしています。12 個のファイルが見つかりました。
(DRYRUN モード) 現在、合計 12 個のファイルがあります。
(DRYRUN モード) デバイスと inode が一意でないため、1 つのファイルを削除しました。
(DRYRUN モード) 合計サイズは 699352 バイトまたは 683 KiB です
サイズが固有であるため、リストから 9 つのファイルを削除しました。残り 2 つのファイル。
(DRYRUN モード) 最初のバイトに基づいて候補を除外しています: リストから 0 個のファイルを削除しました。残り 2 個のファイルです。
(DRYRUN モード) 最後のバイトに基づいて候補を除外しています: リストから 0 個のファイルを削除しました。残り 2 個のファイルです。
(DRYRUN モード) sha1 チェックサムに基づいて候補を除外しています: リストから 0 個のファイルを削除しました。残り 2 個です。
(DRYRUNモード) 2つのファイルが重複しているようです
(DRYRUNモード) 合計で223 KiB削減できます。
(DRYRUN モード) 結果ファイル results.txt を作成中です

rdfind コマンドには、空のファイルを無視する (-ignoreempty) やシンボリック リンクをたどる (-followsymlinks) などの機能も用意されています。説明についてはマニュアルページを参照してください。

-ignoreempty 空のファイルを無視する
-minsize 指定サイズより小さいファイルを無視する
-followsymlinks シンボリックリンクをたどる
-removeidentinode 同一の inode を参照するファイルを削除します
-checksum 使用するチェックサムの種類を指定します
-deterministic はファイルの並び替え方法を決定します
-makesymlinks 重複したファイルをシンボリックリンクに変換します
-makehardlinks 重複ファイルをハードリンクに置き換える
-makeresultsfile は現在のディレクトリに結果ファイルを作成します
-outputname 結果ファイルの名前を指定します
-deleteduplicates 重複ファイルを削除/リンク解除
-sleep ファイルの読み取り間のスリープ時間を設定します (ミリ秒)
-n、-dryrun 実行されるはずだった内容を表示するが、実行しない

rdfind コマンドには、重複を削除するための -deleteduplicates true オプションが用意されていることに注意してください。コマンド構文に関するこの小さな問題が、あなたにとって煩わしいものでないことを願います。 ;-)

rdfind -deleteduplicates を true にします。
...
1 個のファイルを削除しました。<==

おそらく、システムに rdfind コマンドをインストールする必要があります。使い方に慣れるために、実際に試してみるのも良いかもしれません。

fdupesコマンドの使用

fdupes コマンドを使用すると、重複したファイルを簡単に識別することもできます。また、反復処理のための -r など、いくつかの便利なオプションも提供します。この例では、重複したファイルを次のようにグループ化します。

$ 重複 ~
/home/shs/アップグレード
/home/shs/mytwin

/home/shs/lp.txt
/home/shs/lp.man

ペンギン
/home/shs/ペンギン0.png
/home/shs/hideme.png

これは反復処理の使用例です。重複するファイルの多くは重要なもの (ユーザーの .bashrc ファイルと .profile ファイル) であるため、削除してはならないことに注意してください。

# fdupes -r /home
ホームページ
/home/shark/index.html

/home/dory/.bashrc
/home/eel/.bashrc

/home/nemo/.profile
/home/dory/.profile
/home/shark/.profile

/ホーム/ネモ/トライミー
/ホーム/shs/tryme

/home/shs/矢印.png
/home/shs/PNGs/矢印.png

/home/shs/11/files_11.zip
/home/shs/ERIC/file_11.zip

ペンギン0
/home/shs/PNGs/ペンギン.jpg
/home/shs/PNGs/ペンギン0.jpg

/home/shs/サンドラ_回転.png
/home/shs/PNGs/サンドラ_回転.png

fdupe コマンドには、以下にリストする多くのオプションがあります。詳細については、fdupes -h コマンドを使用するか、マニュアル ページを参照してください。

-r --recurse 再帰
-R --recurse: 指定されたディレクトリを再帰的に処理する
-s --symlinks シンボリックリンクされたディレクトリをたどる
-H --hardlinks ハードリンクを重複として扱う
-n --noempty 空のファイルを無視する
-f --omitfirst 一致した各セットの最初のファイルを省略します
-A --nohidden 隠しファイルを無視する
-1 --sameline は 1 行に一致するものをリストします
-S --size 重複ファイルのサイズを表示
-m --summarize 重複ファイルの情報を要約する
-q --quiet 進行状況インジケーターを非表示にする
-d --delete 保存するファイルをユーザーに確認する
-N --noprompt --delete と一緒に使用すると、セットの最初のファイルを保持します
-I --重複が見つかったらすぐに削除する
-p --permissions 異なる所有者/グループを持つファイルを除外しない
         重複した許可ビット
-o --order=WORD 指定に従ってファイルを順序付けする
-i --reverse ソート時に逆順
-v --version fdupesのバージョンを表示
-h --help ヘルプを表示します

fdupes コマンドも、その多くのオプションに慣れるまでにインストールしてしばらく使用する必要があるコマンドです。

要約する

Linux システムには、重複ファイルを見つけて (場合によっては) 削除できるさまざまなツールが用意されているほか、検索する場所や見つかった重複ファイルの処理方法を指定できるオプションも用意されています。

さて、今回の記事は以上です。この記事の内容が皆さんの勉強や仕事に少しでも参考になれば幸いです。123WORDPRESS.COM をよろしくお願いいたします。

出典: https://www.networkworld.com/article/3390204/how-to-identify-same-content-files-on-linux.html#tk.rss_all

著者: Sandra Henry-Stocker トピック: lujun9972 翻訳者: tomjlw 校正者: wxy

以下もご興味があるかもしれません:
  • Linux du コマンドでフォルダのサイズを表示し、降順で並べ替える
  • Linux システムでファイルの読み取りおよび書き込み権限を表示および変更する方法
  • Linux で du を使用してファイルまたはディレクトリが占有するディスク領域のサイズを表示する方法
  • Linux でファイル属性を表示する詳細な例 (ls、lsattr、file、stat)
  • Linux でプロセスによって開かれたファイル ハンドルの数を表示する方法と、その数を変更する方法
  • Linux でフォルダのサイズを表示し、サイズ順に並べ替える方法
  • Linux でディレクトリ ファイルの権限 (コマンド) を表示および変更する
  • Linux でファイルシステムのブロックサイズとメモリページサイズを表示する簡単な方法
  • Linux ファイルシステムのブロックサイズを確認する方法
  • Linux でマウントされたファイルシステムの種類を表示する方法

<<:  コンパイル/サーバーなしでブラウザにCommonJSモジュールを実装する

>>:  使用したコマンドを表示するLinuxコマンドメソッドの概要

推薦する

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...

Vueは要素ツリーコントロールを通じてツリーテーブルを実装します

目次実装効果図依存関係をインストールするカスタムツリーコントロールその他の実装要約するVueでは、要...

CSS トップに戻る コード例

最近のウェブサイトのほとんどはページが長く、4 画面または 5 画面の長さのものもあれば、2 画面ま...

VMware Workstation Pro でサーバー仮想マシンを構築する (グラフィック チュートリアル)

私が使用している VMware Workstation Pro のバージョンは次のとおりです。 1....

MySQL のレイテンシ問題とデータフラッシュ戦略プロセスの分析

目次1. MySQLレプリケーションプロセス2. MySQLの遅延問題の分析3. プロモーション期間...

MySQL 学習ノート: 完全な SELECT ステートメントの使用例と詳細な説明

この記事では、MySQL 学習ノートの select ステートメントの完全な使用方法を例を使用して説...

CentOS 7 構成 Tomcat9+MySQL ソリューション

Tomcatの設定まずTomcatをインストールするTomcatのインストールは、Tomcatのイン...

Mysql5.7 で中国語の文字化けの問題を解決する

MySQL 5.7 を使用すると、Web ターミナル経由でデータベースに中国語の文字を書き込むと文字...

HTMLフォームのいくつかの送信方法の概要

最も一般的で、最もよく使用され、最も一般的な方法は、submit タイプを使用することです。コードを...

mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション

問題を見つける最近、仕事で問題が発生しました。InnoDB タイプの SQL ファイルを実行すると、...

ウェブ開発で遭遇した問題と経験

<br />以下は開発中に遭遇した問題と、そこから得た経験です。デバッグに時間がかかりま...

他の人が私のウェブページを保存したり、サイトをコピーしたりするのを防ぐためのヒント

現在、インターネット上でウェブサイトをコピーすることは非常に一般的です。では、他人が私たちのウェブサ...

MySQL Routerのインストールと展開

目次01 MySQLルーターの紹介MySQL Router とは何ですか? 02 MySQLルータの...

適応レイアウトの処理について(フロートとマージンネガティブマージンを使用)

適応型レイアウトは、実際のアプリケーションでますます一般的になっています。今日は、主にフローティング...