LoginSignup
1
1

More than 5 years have passed since last update.

ハッシュ値を使ってディレクトリ内の変更を確認するshell script

Posted at

1. ディレクトリ内のファイルを確認

   ~ $ cd /media/test/
   /media/test $ ls -1
   japan.wav  tone.wav  voice.wav

2. ファイルをアルファベット順にリスト化する

   /media/test $ ls -1 /media/test |sort |sed 's/^\(.*\)$/"\1"/g' > /media/file_list
   /media/test $ cat /media/file_list 
   "japan.wav"
   "tone.wav"
   "voice.wav"

3. ファイルごとのハッシュ値を求める

   /media/test $ cat /media/file_list |xargs sha1sum > /media/cache_list
   /media/test $ cat /media/cache_list
   2a81a44333cd78a4011131d7988682129499b5ab  japan.wav
   f6f9e50fe7414c8618a9a4a71172072b6915b060  tone.wav
   0a22fa706661d01348569199a68c37aa5373f3c3  voice.wav

★ハッシュ値はデータの中身が一つでも違うと異なる値になる

4. 一つのハッシュ値を求める

   /media/test $ sha1sum /media/cache_list |sed 's/\s\s*\/.*$//g' > /media/cache
   /media/test $ cat /media/cache
   5caaff923034a87e3416542c95608b17693bde0b

5. ディレクトリ内の変更を確認するスクリプト

4.で求めたハッシュ値が前回と異なっていれば変更アリ。同じであれば変更ナシとなる。

#!/bin/sh

# $1 - 前回のハッシュ値

TEST_DIRECTORY="/media/test"
FILE_LIST="/media/file_list"
CACHE_LIST="/media/cache_list"
CACHE="/media/cache"

cd $TEST_DIRECTORY

ls -1 $TEST_DIRECTORY |sort |sed 's/^\(.*\)$/"\1"/g' > $FILE_LIST
cat $FILE_LIST |xargs sha1sum > $CACHE_LIST
sha1sum $CACHE_LIST |sed 's/\s\s*\/.*$//g' > $CACHE

cd

EXPECTED_CACHE=$1
CURRENT_CACHE=`cat $CACHE`

if [ "x${EXPECTED_CACHE}x" = "x${CURRENT_CACHE}x" ]
then
    echo "Up-to-date"
else
    echo "Need to update"
fi

実行結果

   ~ $ /media/./test.sh 5caaff923034a87e3416542c95608b17693bde0b
   Up-to-date
   ~ $ /media/./test.sh aaa
   Need to update

参考
ls -1: https://kazmax.zpp.jp/cmd/l/ls.1.html
xargs: https://www.atmarkit.co.jp/ait/articles/1801/19/news014.html
sortコマンド: https://eng-entrance.com/linux-command-sort
sedコマンド: https://hydrocul.github.io/wiki/commands/sed.html
ハッシュ値: https://eng-entrance.com/linux-command-sha1sum

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1