次のような構造のディレクトリがあります:
.
├── 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
使用しfind
てmd5sum
find relative/path/to/dir -type f -exec md5sum {} + > sums.md5
で MD5 サムのチェックを実行する場合md5sum -c sums.md5
、ファイルを生成したのと同じディレクトリから実行する必要があることに注意してください。これは、出力が現在の場所を基準としたパスになり、それがファイルに格納されるsums.md5
ためです。find
sums.md5
これが問題になる場合は、relative/path/to/dir
絶対パスにすることができます (例:$PWD/
パスの前に を置く)。こうすることで、sums.md5
任意の場所からチェックを実行できます。欠点は、sums.md5
絶対パスが含まれるようになり、サイズが大きくなることです。
フル機能の機能を使用しfind
てmd5sum
この関数を.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
--output
md5sum
関数定義の前半はmd5sums
オプションの解析を担当します。この答え詳細については、 をご覧ください。後半には説明コメントが含まれています。