Edited at

2つのディレクトリ間で差分のあるファイルパスをCSVにまとめるシェルスクリプト

More than 3 years have passed since last update.


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.


参考