ディスク上で少しずつ同一であるが異なるファイル名を持つ重複ファイルを見つけることは可能ですか?
st_size
sをチェックし、同じもののみを含むものを削除してから、一致するst_size
sのmd5sumのみを計算することにより、時間を短縮できます。
ディスク上で少しずつ同一であるが異なるファイル名を持つ重複ファイルを見つけることは可能ですか?
st_size
sをチェックし、同じもののみを含むものを削除してから、一致するst_size
sのmd5sumのみを計算することにより、時間を短縮できます。
回答:
fdupes
これを行うことができます。からman fdupes
:
指定されたパスで重複ファイルを検索します。このようなファイルは、ファイルサイズとMD5シグネチャを比較し、続いてバイトごとに比較することで検出されます。
DebianまたはUbuntuでは、でインストールできますapt-get install fdupes
。Fedora / Red Hat / CentOSでは、でインストールできますyum install fdupes
。Arch Linuxではを使用できpacman -S fdupes
、Gentooではemerge fdupes
。
かなりの時間とメモリを必要とする可能性があるファイルシステムルートから下に向かってチェックを実行するには、のようなものを使用しますfdupes -r /
。
コメントで尋ねられたように、次の操作を行うことで最大の重複を取得できます。
fdupes -r . | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n
ファイル名に改行が含まれている場合、これは壊れます。
fdupes ....... | xargs ls -alhd | egrep 'M |G '
を維持するためにカットまたはsedすることを確認してください):メガバイトまたはギガバイトのサイズのファイルのみを人間が読める形式で保持します。実際の出力に合わせてコマンドを変更します。
du
取得しsort
たら、パイプで通知されます。
別の優れたツールはfslint
次のとおりです。
fslintは、重複ファイルや問題のあるファイル名など、ファイルシステムに関するさまざまな問題を見つけるためのツールセットです。
GUIに加えて個々のコマンドラインツールが利用可能であり、それらにアクセスするために、標準インストールの/ usr / share / fslint / fslintディレクトリを$ PATHに変更または追加できます。そのディレクトリ内のこれらの各コマンドには、パラメータの詳細を示す--helpオプションがあります。
findup - find DUPlicate files
debianベースのシステムでは、次のものでインストールできます。
sudo apt-get install fslint
サードパーティのツールをインストールしたくない、またはインストールできない場合は、手動でこれを行うこともできます。このようなプログラムのほとんどは、ファイルのチェックサムを計算することにより機能します。同じmd5sumのファイルには、ほぼ確実にまったく同じデータが含まれます。したがって、次のようなことができます。
find / -type f -exec md5sum {} \; > md5sums
gawk '{print $1}' md5sums | sort | uniq -d > dupes
while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
サンプル出力(この例のファイル名は同じですが、異なる場合でも機能します):
$ while read d; do echo "---"; grep $d md5sums | cut -d ' ' -f 2-; done < dupes
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/if_bonding.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/if_bonding.h
---
/usr/src/linux-headers-3.2.0-3-common/include/linux/route.h
/usr/src/linux-headers-3.2.0-4-common/include/linux/route.h
---
/usr/src/linux-headers-3.2.0-3-common/include/drm/Kbuild
/usr/src/linux-headers-3.2.0-4-common/include/drm/Kbuild
---
これは、前述の専用ツールよりもはるかに遅くなりますが、機能します。
st_size
、このサイズのファイルが1つしかないファイルを削除し、同じサイズのファイル間でのみmd5sumを計算すると、はるかに速くなりますst_size
。
簡単な答え:はい。
長いバージョン:ウィキペディアのfdupesエントリをご覧ください。既製のソリューションの非常に素晴らしいリストがあります。もちろん、そうではありません、自分自身を書くことができ、そのようなハッシュプログラム-難しいdiff
、sha*sum
、find
、sort
とuniq
仕事をする必要があります。1行に配置することもできますが、それでも理解できます。
ハッシュ関数(ここではMD5)がドメインで衝突しないと思われる場合:
find $target -type f -exec md5sum '{}' + | sort | uniq --all-repeated --check-chars=32 \
| cut --characters=35-
同じファイル名をグループ化したいですか?not_uniq.sh
出力をフォーマットする簡単なスクリプトを作成します。
#!/bin/bash
last_checksum=0
while read line; do
checksum=${line:0:32}
filename=${line:34}
if [ $checksum == $last_checksum ]; then
if [ ${last_filename:-0} != '0' ]; then
echo $last_filename
unset last_filename
fi
echo $filename
else
if [ ${last_filename:-0} == '0' ]; then
echo "======="
fi
last_filename=$filename
fi
last_checksum=$checksum
done
次にfind
、スクリプトを使用するようにコマンドを変更します。
chmod +x not_uniq.sh
find $target -type f -exec md5sum '{}' + | sort | not_uniq.sh
これは基本的な考え方です。find
ファイル名に文字が含まれている場合は、おそらく変更する必要があります。(例:スペース)
私は、fdupesの最近の強化フォークを追加するために考えjdupesになることを約束され、より迅速かつfdupes(例えばサイズフィルタ)よりも豊富な多くの機能:
jdupes . -rS -X size-:50m > myjdups.txt
これにより、現在のディレクトリで50MBを超える重複ファイルが再帰的に検索され、結果のリストがmyjdups.txtに出力されます。
出力はサイズでソートされておらず、ビルドされていないように見えるので、これを達成するために上記の@Chris_Downの回答を採用しました。
jdupes -r . -X size-:50m | {
while IFS= read -r file; do
[[ $file ]] && du "$file"
done
} | sort -n > myjdups_sorted.txt
ウィキペディアには、このタスクに利用可能なオープンソースソフトウェアのリストに関する記事(http://en.wikipedia.org/wiki/List_of_duplicate_file_finders)がありましたが、現在は削除されています。
fslintのGUIバージョンは非常に興味深いものであり、マスクを使用して削除するファイルを選択できることを追加します。重複した写真をきれいにするのに非常に便利です。
Linuxでは次を使用できます。
- FSLint: http://www.pixelbeat.org/fslint/
- FDupes: https://en.wikipedia.org/wiki/Fdupes
- DupeGuru: https://www.hardcoded.net/dupeguru/
多くのシステム(windows、mac、linux)での最後の2つの作業、FSLintを確認していません
これについての私の見解は次のとおりです。
find -type f -size +3M -print0 | while IFS= read -r -d '' i; do
echo -n '.'
if grep -q "$i" md5-partial.txt; then echo -e "\n$i ---- Already counted, skipping."; continue; fi
MD5=`dd bs=1M count=1 if="$i" status=noxfer | md5sum`
MD5=`echo $MD5 | cut -d' ' -f1`
if grep "$MD5" md5-partial.txt; then echo "\n$i ---- Possible duplicate"; fi
echo $MD5 $i >> md5-partial.txt
done
ファイルの最初の1 MBまでしかハッシュしないという点が異なります。
これにはいくつかの問題/機能があります:
私はこれを使ってビデオクリップを比較するので、これで十分です。