diff
명령의 출력(이 경우)을 파일로 리디렉션 하고 싶지만 비교하는 파일에 차이가 있는 경우에만 가능합니다. 예를 들어, a
, b
, 세 개의 파일이 있다고 가정해 보겠습니다. c
여기서 a
및 b
는 동일하지만 a
및 c
그렇지 않습니다.
diff a c > output.txt
이렇게 하면 diff a b > output.txt
차이가 있든 없든 output.txt
생성이 됩니다. output.txt
차이가 있는 경우 에만 생성하고 싶습니다 (예: 차이가 1을 반환함).
나는 비슷한 것을 하고 싶다:
if ! diff a c > /dev/null; then
diff a c > output.txt
fi
그러나 명령을 두 번 실행할 필요는 없습니다. 나할 수 있다다음과 같이 명령 내용을 저장합니다.
res=$(diff a c)
if [ $? != 0 ]; then
echo "$res" > output.txt
fi
그러나 나는 echo
"중개자"로 개입하게 되어 몇 가지 문제를 일으킬 수 있습니다. 코드를 복제하지 않고 출력이 있는 경우에만 출력을 리디렉션/파일 생성하는 방법은 무엇입니까?
답변1
명령을 한 번 호출하고 출력을 리디렉션한 다음 차이를 만들지 않고 출력을 제거할 수 있습니다.
diff a c > output.txt && rm output.txt
답변2
diff
적어도 파일이 다른 경우 상대적으로 비용이 많이 드는 명령입니다. 최소 변경 세트를 계산하는 것은 (상대적으로) CPU를 많이 사용합니다. 그러니 두 번 다시 하고 싶지 않은 것도 이해가 됩니다.
cmp
그러나 CPU에 관한 한 가격은 저렴합니다. 파일 크기가 합리적이라고 가정하면(여러 GB 파일에 대해 diff를 호출할지는 의심스럽습니다) 성능 비용이 거의 없으며 동일한 파일을 사용하면 더 빠를 수도 있습니다.
if ! cmp -s a c; then # -s = silent, do not print results to console
diff a c > output.txt
fi
답변3
임시 파일은 어떻습니까?
diff a c > /tmp/output.txt
if [ $? != 0 ]; then mv /tmp/output.txt /my/folder/output.txt; else rm -f /tmp/output.txt; fi
확인 대화 상자를 제거하려면 -f
로 바꾸십시오.-i
이렇게 하면 echo, printf 등 임시 변수나 "중개자" 없이 명령을 두 번만 실행하면 됩니다.