私は体系的ではなく、複数のフォルダにファイルが重複している巨大な曲フォルダを持っています。
2つの簡単な一致を使用して重複した項目を見つけて削除するためのツールまたはスクリプトをお勧めします。
- ファイル名が同じです。
- ファイルサイズは全く同じです。
この場合、song.mp3
およびに保存されるファイルサイズは1234バイトです。ツール/スクリプトのコピーは1つだけ保管してください。/songs/album1
/songs/albumz
頑張りましたチカオカFedoraではファイル名またはファイルサイズで検索できますが、検索することはできません。両方一緒に組み合わせてください。
答え1
rdfind
必要に応じて行うことができますが、ファイルサイズの代わりに暗号化ハッシュ/チェックサム(md5、sha1、またはsha256)に依存する必要があります。
ハッシュ値はファイルサイズよりも厳しい基準ですが、必要なものでもそうでない場合もあります。たとえば、すべてを考えてみましょう。メタデータ音楽ファイルから:あるファイルが作曲家としてリストされ、別の潜在的な重複ファイルが作曲家としてリストさSchubert
れている場合Bruckner
そしてファイルの他のすべての内容はまったく同じです。ファイルサイズフィルタ一致項目に分類しますが、ハッシュフィルタ習慣。これハッシュフィルタより使用されますファイルサイズフィルタただし、時々重複する項目をフィルタリングする場合は問題にならない可能性があります。
実際に実行する前に、目的の結果が出ると確信するまでこのオプションをrdfind
よくman rdfind
読んで使用してください。-dryrun
今後、このチュートリアルrdfind
重複ファイルを見つけるためのリストと他の3つのユーティリティ。
ファイルサイズをフィルタリングするためのツールはわかりませんが、最初から新しく作成するには、find
何かを一緒に使用してまとめると思いますawk
。これがあなたが望むものであるかどうか教えてください。あまり難しくないと思いますが、rdfind
それがあなたの要件を満たしている場合はあまり意味がありません。
答え2
実際、これに外部ユーティリティを使用する必要はありません。一連の標準コマンドを接続して長い道のりを進めることができます。これをシェルスクリプトまたは関数に保存すると、常に覚えておくことができます。
重複を検出するには、サイズとファイル名に基づいてキー付き連想配列にすべてのファイルパスを保存できます。しかし、ファイルのコレクションが多いと言われたので、代わりにソートすることをお勧めします。次に、2番目にソートします。ユニーク2つの結果を比較すると、重複した結果が生成されるようにするオプションです。
最初のソートの出力を2回使用しようとしています。これには一時ファイルを使用できます。名前付きパイプやfifosなどは、この単純な作業にはあまり役に立ちません。このコマンドは、
mktemp
ディレクトリにある安全で一意のファイル名を印刷します。/tmp/
とともにコマンドの置き換え$(...)
その名前を名前付き変数tmp
または別の名前に割り当てることができます。あなたがしていることを理解するためにエコーしてください。これで、サイズとファイル名の2つの主要なフィールドを使用し、フルパスも必要です。便利なことに、スラッシュは
/
有効なファイル名文字ではありません。これは、ディレクトリ名とファイル名を区別するために予約されています。したがって、/
これら3つのフィールドの間を区切り文字として使用できます。-printf
このコマンドの機能は次のとおりですfind
。すべてのファイル-type f
(ile)を見つけて、サイズ、%s
ファイル名%f
、フルパスを%p
すべて/
。フルパスにはより多くのスラッシュが含まれていますが、最初の2つのスラッシュ区切り文字(形式で明示的に指定されたもの-printf
)だけが私たちのものであることがわかります。|
コマンドの出力find
(サイズ、ファイル名、およびフルパスのリスト)をsort
コマンドにパイプします。フィールドがスラッシュで区切られ、-t /
キーが最初の2つのフィールドにあることを知らせます-k 1,2
。ソートされたリストは一時ファイルにすぐに保存できますが、パフォーマンスを向上させるtee
ためにパイプを開いたままにすることができるため、コマンドを使用することを選択しました。|
ソートされたリストをにパイプしてtee
そのリストのコピーを指定されたファイル名に保存し、何らかの方法でパイプを"$tmp"
次のパイプにエコーします。パイプは
|
tee
ソートされたリストを同じキーの2番目のリストに反映しますが、ソートキーにORをsort
出力します。-u
--unique
|
一意のサイズ+ファイル名項目のリストをdiff
最初の入力としてコマンドにパイプします-
(標準入力)、一時ファイルを"$tmp"
2番目のファイルとして使用します。通常diff
、いくつかのフラグが出力に追加され、変更を識別できるようになります。しかし、私たちはそれを必要とせず、私たちが必要とする出力を混乱させます。我々は、ユニークなリストのすべてのアイテムが完全なリストにもあることを知っています。私たちはリスト全体に共通の追加行だけを望んでいます。これがコマンドのオプションにdiff
必要なものです。これまでのコマンドは、重複ファイルの短いリストを出力します。各冗長セットの1つは、一意のリストにまだ表示されるため省略されます。このリストの各エントリを処理し、最後の部分(フルパス名)を処理するために
|
それを構文でパイプしますwhile read
。指定されたパラメータ名の下に各行を保存しますdupl
。 bashパラメーター拡張構文を使用すると、ファイル名とスラッシュ区切り文字をサイズに追加した#
プレフィックスを省略し、残りの部分はファイルのコピーへのフルパスです。まず、完全なコマンドを実行して徹底的に確認し、削除コマンドに置き換えることをお勧めします。あるいは、より良い方法は、ごみ箱ユーティリティの1つを使用して重複エントリを自分のディレクトリに移動してディレクトリをクリーンアップしますが、何も失われないことです。*/*/
/
echo
rm
Trash
tmp=$(mktemp) echo temp file is "$tmp" find -type f -printf "%s/%f/%p\n" | sort -t / -k 1,2 | tee "$tmp" | sort -t / -k 1,2 -u | diff --new-line-format="%L" --unchanged-line-format="" - "$tmp" | while read dupl;do echo "${dupl#*/*/}"; done rm "$tmp"
後でクリーンアップして一時ファイルをクリーンアップします
"$tmp"
。
答え3
追加のパッケージをインストールせずにクイック方法は次のとおりです。
#!/bin/bash
find /path/to/compare/against -type f -printf "%s %f\n" | \
while read SIZE FILE; do
find /where/to/look/for/duplicates -iname "$FILE" -size "${SIZE}c" | \
while read DUPLICATE; do
# whatever you want to do with the duplicate file
done
done