diff -r로 디렉토리를 비교하면서 특정 파일명의 결과만 표시

7454 단어 ShellScriptUNIXBash

소개



디렉토리를 diff 명령으로 재귀 적으로 비교할 때,diff -r <dir1> <dir2> 같아요.
그 중에서 특정 파일 이름의 결과를 제외하고 싶다면diff -r -x <filename> <dir1> <dir2> 같으면 OK.
참고: htps : // / xjm. 오 sd. jp/hml/g 누마니아 k/만 1/ぢ f. 1. HTML

그러나! 제외는 가능한 주제에 「특정 파일명의 결과만을 표시」라고 하는 것은diff 명령의 기능으로 존재하지 않는 것 같습니다.
-q 옵션이 있으면 diff -qr <dir1> <dir2> | grep <filename>에서 OK이지만,
파일의 내용까지 제대로 보고 싶을 때는 그렇게 가지 않는다.

하고 싶을 때마다 조사해서는 「역시 없어-...」라고 실망했지만,
없으면 쉘 스크립트 짜서 해라! 라고 생각해서 만들었습니다.

코드



실행 권한을 붙여 저장하고 이런 식으로 실행해보세요 ~../tdiff.sh <dir1> <dir2> <target filename>
tdiff.sh
#!/usr/bin/env bash

# diffコマンド名(普通のdiffでもOK)
# diffCommand=diff
diffCommand=colordiff

# 第一引数がハイフンで始まったらそのままdiffのオプションに渡す
if [ "${1:0:1}" = "-" ]; then
  option="$1"
  shift
else
  option="-uN"
fi

if [ $# -lt 3 ]; then
  echo "Usage: $0 [<diff option>] <dir1> <dir2> <target filename>"
  exit 1
fi

# $1 $2はディレクトリ名、$3はdiffを取りたいファイル名
output=$(diff -qr $1 $2)
while read -r line; do
  string=$(echo "$line" | awk '{print $1}');
  if [ $(echo $string | grep -e 'Only') ]; then
    # 片方にしかファイルがない場合
    fileName=$(echo "$line" | awk '{print $4}');
    if [ $fileName != "$3" ]; then
      continue
    fi
    path=$(echo "$line" | awk '{print $3}' | sed -e "s/\:/\//");
    fromFile=${path/$1/$2/}/$fileName;
    toFile=${path/$2/$1/}/$fileName;
  else
    # 両方にファイルがある場合
    fromFile=$(echo "$line" | awk '{print $2}');
    toFile=$(echo "$line" | awk '{print $4}');
    fileName=$(basename "$toFile")
    if [ $fileName != "$3" ]; then
      continue
    fi
  fi

  $diffCommand $option $fromFile $toFile
done <<< "$output"

보충



나는 색칠을 좋아하기 때문에 colordiff를 지정하고 있지만,
설치하지 않으면 오류가 발생해야하므로주의하십시오.
alias tdiff=~/hoge/fuga/tdiff.sh 처럼 별칭 붙이면 편리합니다.
스크립트 이름 tdiff은 "targetable diff"라는 의미입니다.

감사의 말



모두 자력으로 쓰는 것은 시간이 걸릴 것 같아서
비슷한 일을하는 사람을 찾았을 때,
디렉토리 간의 차등 파일 일람 취득을 bash script로 실현시킨다
매우 도움이되었습니다!
꽤 유용하게 해 주셔서 감사합니다

결론



실은 쉘 예술도 좋아하므로, 더 팔 닦아 Qiita에도 점점 쓰고 싶다-라고 생각한 소존입니다.
그럼 또 ~.

좋은 웹페이지 즐겨찾기