ディレクトリツリー内のすべてのファイルをmd5する 質問する

ディレクトリツリー内のすべてのファイルをmd5する 質問する

次のような構造のディレクトリがあります:

.
├── Test.txt
├── Test1
│   ├── Test1.txt
│   ├── Test1_copy.txt
│   └── Test1a
│       ├── Test1a.txt
│       └── Test1a_copy.txt
└── Test2
   ├── Test2.txt
   ├── Test2_copy.txt
   └── Test2a
       ├── Test2a.txt
       └── Test2a_copy.txt

このディレクトリ内のすべてのファイルの md5 チェックサムを作成する bash スクリプトを作成したいと思います。CLI でスクリプト名を入力し、ハッシュするディレクトリへのパスを入力して動作させたいです。これを実現する方法はたくさんあると思います。現在、私は次のものを持っています:

#!/bin/bash

for file in "$1" ; do 
    md5 >> "${1}__checksums.md5"
done

これはハングアップして動作しません。おそらく find を使用する必要があるでしょうか?

注意点が 1 つあります。ハッシュするディレクトリには、異なる拡張子を持つファイルがあり、必ずしもこのツリー構造とまったく同じであるとは限りません。このようなさまざまな状況でも機能するものが必要です。

ベストアンサー1

使用md5deep

md5deep -r path/to/dir > sums.md5

使用しfindmd5sum

find relative/path/to/dir -type f -exec md5sum {} + > sums.md5

で MD5 サムのチェックを実行する場合md5sum -c sums.md5、ファイルを生成したのと同じディレクトリから実行する必要があることに注意してください。これは、出力が現在の場所を基準としたパスになり、それがファイルに格納されるsums.md5ためです。findsums.md5

これが問題になる場合は、relative/path/to/dir絶対パスにすることができます (例:$PWD/パスの前に を置く)。こうすることで、sums.md5任意の場所からチェックを実行できます。欠点は、sums.md5絶対パスが含まれるようになり、サイズが大きくなることです。

フル機能の機能を使用しfindmd5sum

この関数を.bashrcファイル(ディレクトリ内$HOME)に配置することができます。

function md5sums {
  if [ "$#" -lt 1 ]; then
    echo -e "At least one parameter is expected\n" \
            "Usage: md5sums [OPTIONS] dir"
  else
    local OUTPUT="checksums.md5"
    local CHECK=false
    local MD5SUM_OPTIONS=""

    while [[ $# > 1 ]]; do
      local key="$1"
      case $key in
        -c|--check)
          CHECK=true
          ;;
        -o|--output)
          OUTPUT=$2
          shift
          ;;
        *)
          MD5SUM_OPTIONS="$MD5SUM_OPTIONS $1"
          ;;
      esac
      shift
    done
    local DIR=$1 

    if [ -d "$DIR" ]; then  # if $DIR directory exists
      cd $DIR  # change to $DIR directory
      if [ "$CHECK" = true ]; then  # if -c or --check option specified
        md5sum --check $MD5SUM_OPTIONS $OUTPUT  # check MD5 sums in $OUTPUT file
      else                          # else
        find . -type f ! -name "$OUTPUT" -exec md5sum $MD5SUM_OPTIONS {} + > $OUTPUT  # Calculate MD5 sums for files in current directory and subdirectories excluding $OUTPUT file and save result in $OUTPUT file
      fi
      cd - > /dev/null  # change to previous directory
    else
      cd $DIR  # if $DIR doesn't exists, change to it to generate localized error message
    fi
  fi
}

を実行した後は、通常のコマンドと同じようにsource ~/.bashrc使用できます。md5sums

md5sums path/to/dir

ディレクトリ内にファイルを生成します。checksums.md5このファイルにはpath/to/dir、このディレクトリとサブディレクトリ内のすべてのファイルの MD5 サムが含まれます。以下を使用します。

md5sums -c path/to/dir

path/to/dir/checksums.md5ファイルから合計をチェックします。

path/to/dir相対または絶対のmd5sumsいずれでも問題なく機能することに注意してください。結果のファイルには、checksums.md5常に への相対パスが含まれます。またはオプションを指定するpath/to/dirと、デフォルトとは異なるファイル名を使用できます。 、 、以外のすべてのオプションは に渡されます。checksums.md5-o--output-c--check-o--outputmd5sum

関数定義の前半はmd5sumsオプションの解析を担当します。この答え詳細については、 をご覧ください。後半には説明コメントが含まれています。

おすすめ記事