Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

MarkAda
大学生
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away