2つのディレクトリ間で差分のあるファイルパスをCSVにまとめるシェルスクリプト
概要
2つのディレクトリの間で差分のあるファイルパスを出力するシェルスクリプトの紹介です。
今回はShift_JISのCSVにまとめます。
差分の比較
diffコマンドを使用します。
使用するオプションは下記です。
オプション | 内容 |
---|---|
-r | ディレクトリ配下を再帰的に比較します。 |
-q | 差分のあったファイルパスと、どういう差(「片方のディレクトリのみ存在する」「ファイルの内容に差がある」)なのかをのみ表示します。 |
文字コードの変換
今回はnkfコマンドを使用します。
使用するオプションを変更すれば別の文字コードにも変換可能です。
今回使用するオプションは下記です。
オプション | 内容 |
---|---|
-s | Shift_JISへ変換します。 |
--overwrite | 引数に指定したファイルを文字コードを変換した内容で上書きします。 |
(文字コードを変換できればなんでも良いです。iconvでも大丈夫です。)
CSVに出力される内容
「片方のディレクトリのみ存在する」場合
Only in,/var/www/html/production/: file1.txt
「ファイルの内容に差がある」場合
differ,/var/www/html/production/file2.txt and /var/www/html/staging/file2.txt
実際のシェルスクリプト
diff
の実行部分でLANG=en
を指定しているので、サーバの言語設定がen
以外の場合でも
実行時はen
の結果がsed
に渡ります。
check_diff.sh
#!/bin/bash
check_diff() {
local dir1=$1
local dir2=$2
local export_path=$3
local now=$(date "+%Y%m%d_%H%M%S")
local file_name='diff_'${now}'_sjis.csv'
local working_dir=$(cd $(dirname $0); pwd)
# 出力先に指定がなければ実行場所に出力します
if [ -n "$3" ]; then
export_path=${working_dir}
fi
export_path=${export_path}${file_name}
echo 'DIR1 : '${working_dir}/${dir1}
echo 'DIR2 : '${working_dir}/${dir2}
echo 'EXPORT PATH : '${working_dir}/${export_path}
export_diff ${dir1} ${dir2} ${export_path}
convert_encoding ${export_path}
}
export_diff() {
local dir1=$1
local dir2=$2
local export_path=$3
LANG=en diff -qr ${dir1} ${dir2} | sed \
-e 's:Only in :Only in,:' \
-e 's:Files :differ,:' \
-e 's: differ$::' \
> ${export_path}
}
convert_encoding() {
local export_path=$1
nkf -s --overwrite ${export_path}
echo 'CHARACTER ENCODING : '$(nkf -g ${export_path})
}
readonly DIR1=$1
readonly DIR2=$2
readonly EXPORT_PATH=$3
echo 'Check diff start ...'
check_diff ${DIR1} ${DIR2} ${EXPORT_PATH}
echo 'Check diff end.'
exit 0
使い方
check_diff.sh に実行権限を与え、下記のように実行します。
第一引数に比較したいディレクトリ1
第二引数に比較したいディレクトリ2
第三引数に比較結果を出力したいディレクトリ(指定しない場合は実行したディレクトリに出力されます)
./check_diff.sh /var/www/html/production/ /var/www/html/staging/
実行結果
実行結果として下記が表示されます。
- 比較対象のディレクトリ
- 出力先のパス
- 出力した結果ファイルの文字コード
[root@XXXXXX ~]# ./check_diff.sh /var/www/html/production/ /var/www/html/staging/
Check diff start ...
DIR1 : /var/www/html/production/
DIR2 : /var/www/html/staging/
EXPORT PATH : /var/www/html/diff_20160809_181206_sjis.csv
CHARACTER ENCODING : Shift_JIS
Check diff end.