ファイル名をMD5ハッシュ値にし、ファイルの重複を防止するやつ

ダウンロードしてきた画像のファイル名は、デジカメで撮影した画像のそれと違って、特に意味を持ちません。ほとんどの場合、画像が掲載されていたウェブサイトの管理者やCGIが勝手に付けた名前である事が多いわけです。

そんなファイルがいくつも貯まっていくと、整理にもひと苦労です。そこで、ファイル名を MD5 のハッシュ値にしておけば、重複したファイルを整理する事が出来ます。以下に例を示します。

#!/bin/sh
# coding: utf-8
if [ $# -gt 0 ]; then
  for file in “$@”
  do
    if [ -f “$file” -a -s “$file” ]; then
      # Get file extention
      ext=`basename “$file” | sed ‘s/^.*\.\(.*\)$/\1/gi’`;
      if [ “$file” == $ext ] ; then
        ext=””;
      else
        ext=”.$ext”;
      fi
      # Make new file name
      nfile=`dirname “$file”`/`md5sum “$file” | cut -c -32`$ext;
      # echo $file to $nfile
      mv “$file” $nfile
    fi
  done
else
  cat <<EOUSG
  md5name – Rename the file with md5sum string.
            By dyama=members.fsf.org 2010.
            Usage:
            $0 File […]
EOUSG
fi

このスクリプトは、シェル展開と組み合わせて、以下のように使います。

# JPEG画像を一括リネーム
$ md5name ./image/neta/*.jpg

名前が重複(=つまり、ファイル内容が完全に一致)したものは上書きされるため、結果、重複したファイルを削除することになります。

-wリネームを対話的に確認する
-fリネーム後のファイル名を吐くだけ
-zサイズがゼロのファイルも処理する
-xサイズがゼロのファイルは削除する
-d出力ディレクトリを指定する
-cリネームではなくコピーする
-vバージョン情報
-hヘルプ

こんなオプションを使えるようにしたら、需要が出てくるかなあ。

2016/05/08 追記

ファイル名に半角スペースが入っていた場合でも正しく処理できるような修正を、コメントにて狸おやじさんよりいただきました。スクリプトを差し替えておきました。

※ 2020/07/02 度重なるブログ移転・ブログシステムのアップデートにより崩れた記事を校正。

「ファイル名をMD5ハッシュ値にし、ファイルの重複を防止するやつ」への2件のフィードバック

  1. 情報ありがとうございます。大変助かりました。
    空白入りファイル名に対応した改善版をお返しします。
    #!/bin/sh
    if [ $# -gt 0 ]; then
    for file in “$@”
    do
    if [ -f “$file” -a -s “$file” ]; then
    # Get file extention
    ext=`basename “$file” | sed ‘s/^.*\.\(.*\)$/\1/gi’`;
    if [ “$file” == $ext ] ; then
    ext=””;
    else
    ext=”.$ext”;
    fi
    # Make new file name
    nfile=`dirname “$file”`/`md5sum “$file” | cut -c -32`$ext;
    # echo $file to $nfile
    mv “$file” $nfile
    fi
    done
    else
    cat <<EOUSG
    md5name – Rename the file with md5sum string.
    By dyama=members.fsf.org 2010.
    Usage:
    $0 File […]
    EOUSG
    fi

  2. 狸おやじさん

    おお、ありがとうございます!
    2010年の古い記事なので、Githubに置いてスクリプトを差し替えておきます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください