スクリプトを使用してOSXで重複ファイルを見つけて削除する


11

From:http : //www.chriswrites.com/2012/02/how-to-find-and-delete-duplicate-files-in-mac-os-x/これを変更して最初のバージョンのみを削除するにはそれが見るファイル。

Spotlightまたはユーティリティフォルダからターミナルを開きます。cdコマンドを使用して、検索するディレクトリ(フォルダ)に移動します(サブフォルダを含む)。コマンドプロンプトでcdと入力します。たとえば、cd〜/ Documentsと入力して、ディレクトリをホームドキュメントフォルダーに変更します。コマンドプロンプトで、次のコマンドを入力します。

find . -size 20 \! -type d -exec cksum {} \; | sort | tee /tmp/f.tmp | cut -f 1,2 -d ' ' | uniq -d | grep -hif  /tmp/f.tmp > duplicates.txt

この方法では、単純なチェックサムを使用して、ファイルが同一かどうかを判断します。重複するアイテムの名前は、現在のディレクトリのduplicates.txtという名前のファイルにリストされます。これを開いて同一のファイルの名前を表示する重複を削除するさまざまな方法があります。テキストファイル内のすべてのファイルを削除するには、コマンドプロンプトで次のように入力します。

while read file; do rm "$file"; done < duplicates.txt

回答:


4

まず、最初のコマンドラインを並べ替えて、findコマンドで見つかったファイルの順序を維持する必要があります。

find . -size 20 ! -type d -exec cksum {} \; | tee /tmp/f.tmp | cut -f 1,2 -d   | sort | uniq -d | grep -hif  /tmp/f.tmp > duplicates.txt

(注:私が使用した私のマシンでのテスト目的でfind . -type f -exec cksum {} \;

次に、最初の複製を除くすべてを印刷する1つの方法は、補助ファイルを使用することです/tmp/f2.tmp。それから私たちは次のようなことをすることができます:

while read line; do
    checksum=$(echo "$line" | cut -f 1,2 -d' ')
    file=$(echo "$line" | cut -f 3 -d' ')

    if grep "$checksum" /tmp/f2.tmp > /dev/null; then
        # /tmp/f2.tmp already contains the checksum
        # print the file name
        # (printf is safer than echo, when for example "$file" starts with "-")
        printf %s\\n "$file"
    else
        echo "$checksum" >> /tmp/f2.tmp
    fi
done < duplicates.txt

/tmp/f2.tmpこれを実行する前に、たとえば次のコマンドを使用して、それが存在し、空であることを確認してください。

rm /tmp/f2.tmp
touch /tmp/f2.tmp

これが役立つことを願って=)


39

別のオプションはfdupesを使用することです:

brew install fdupes
fdupes -r .

fdupes -r .現在のディレクトリで再帰的に重複ファイルを見つけます。追加-dして重複を削除します—どのファイルを保持するかを尋ねられます。代わりにを追加した場合-dN、fdupesは常に最初のファイルを保持し、他のファイルを削除します。


7
fdupesすごい!魅力のように働いた!ありがとう兄貴。!
racl101 14

3

内容のハッシュに一致するようにファイルの名前を変更するスクリプトを書きました。

ファイルのバイトのサブセットを使用するので高速であり、衝突が発生した場合は、次のように名前にカウンターが追加されます。

3101ace8db9f.jpg
3101ace8db9f (1).jpg
3101ace8db9f (2).jpg

これにより、必要以上に写真を他の誰かのソフトウェアに信頼させることなく、自分で複製を簡単に確認および削除できます。

スクリプト:https : //gist.github.com/SimplGy/75bb4fd26a12d4f16da6df1c4e506562

ここに画像の説明を入力してください


GIF表示専用+1 !!
NoobEditor

0

これは、Michael Tsaiが開発したEagleFilerアプリを利用して行われます。

tell application "EagleFiler"

      set _checksums to {}
      set _recordsSeen to {}
      set _records to selected records of browser window 1
      set _trash to trash of document of browser window 1
      repeat with _record in _records
          set _checksum to _record's checksum
          set _matches to my findMatch(_checksum, _checksums, _recordsSeen)
          if _matches is {} then
              set _checksums to {_checksum} & _checksums
              set _recordsSeen to {_record} & _recordsSeen
          else
              set _otherRecord to item 1 of _matches
              if _otherRecord's modification date > _record's modification date 
then

            set _record's container to _trash
            else
                set _otherRecord's container to _trash
                set _checksums to {_checksum} & _checksums
                set _recordsSeen to {_record} & _recordsSeen
            end if
        end if
    end repeat
end tell

on findMatch(_checksum, _checksums, _recordsSeen)

    tell application "EagleFiler"
        if _checksum is "" then return {}
        if _checksums contains _checksum then
            repeat with i from 1 to length of _checksums
                if item i of _checksums is _checksum then
                    return item i of _recordsSeen
                end if
            end repeat
        end if
        return {}
    end tell

end findMatch

この投稿で提案されている重複ファイルリムーバーを使用して、重複を自動的に削除することもできます。


1
(1)「EagleFiler」とは?それはmacOSの一部ですか?そうでない場合、どこで入手できますか?(2)それはコードの1つの長いブロック(私がそれを修正した方法)であることを意味していますか?(3)インデントを修正してください。(4)正確にこれをどのように使用しますか?
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.