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