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에도 점점 쓰고 싶다-라고 생각한 소존입니다.
그럼 또 ~.
Reference
이 문제에 관하여(diff -r로 디렉토리를 비교하면서 특정 파일명의 결과만 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/the_red/items/2dba32559db630da1ef9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
실행 권한을 붙여 저장하고 이런 식으로 실행해보세요 ~.
./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에도 점점 쓰고 싶다-라고 생각한 소존입니다.
그럼 또 ~.
Reference
이 문제에 관하여(diff -r로 디렉토리를 비교하면서 특정 파일명의 결과만 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/the_red/items/2dba32559db630da1ef9
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
실은 쉘 예술도 좋아하므로, 더 팔 닦아 Qiita에도 점점 쓰고 싶다-라고 생각한 소존입니다.
그럼 또 ~.
Reference
이 문제에 관하여(diff -r로 디렉토리를 비교하면서 특정 파일명의 결과만 표시), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/the_red/items/2dba32559db630da1ef9텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)