명령 출력의 두 파일 비교 [닫기]

명령 출력의 두 파일 비교 [닫기]

현재 디렉토리에 XML 파일이 많이 있습니다.

질문 1.

내가 읽은 바에 따르면 eval은 결과를 반환하고 이를 변수에 저장합니다. 하지만 다음 명령을 사용하는 동안 오류가 발생합니다.

find ./ -name '*.xml' | file=$(eval awk '{print $0}') ; echo $file

편집(CAS가 지적한 대로 평가를 생략한 후) -

eval을 생략하면 단순히 빈 문자열이 반환됩니다.

find ./ -name '*.xml' | file=$(awk '{print $0}') ; echo $file

질문 2.

저는 단지 bash를 배우고 싶었기 때문에 처음 두 파일을 find의 출력과 비교하는 복잡한 시퀀스를 만들었습니다. 복잡한 순서는 단지 bash 프로그래밍의 개념을 이해하기 위한 것입니다.

find ./ -name '*.xml' | file=$(awk '{print $0}') ; echo $file && diff -y $(sed '2q;d' $file) $(sed '1q;d' $file)

답변1

다음은 bash에서 배열을 사용하여 이를 수행하는 한 가지 방법에 대한 매우 간단한 예입니다.

#!/bin/bash

IFS=$'\n' files=( $(find . -name '*.xml' | head -n 2) )

if [[ -n ${files[0]} && -n ${files[1]} ]] ; then
  diff "${files[0]}" "${files[1]}"
fi

그러면 find ... | head -n 2명령이 실행되어 각 줄(반환된 파일 이름)을 배열에 저장합니다 $files. 처음 두 배열 요소(0과 1)가 비어 있지 않으면 해당 파일 이름을 사용하여 diff를 실행합니다.

디렉터리나 파일 이름에 개행 문자가 포함되어 있으면 중단될 수 있습니다.

답변2

당신은 그것을 사용할 수 있습니다 :

diff "$(find . -type f -name 'diff')" "$(find . -type f -name 'diff2')"

이렇게 검색하시면 됩니다차이점파일, 검색차이점 2파일을 비교하고차이점도구.

답변3

허용되는 답변을 확장하고 전반적인 이해를 돕기 위해 내 답변을 게시하고 있습니다.

문제 1에 대한 해결책.

첫 번째 문제는 eval의 사용입니다. 여기서는 eval이 필요하지 않습니다. 명령 대체를 위해 $(...)를 사용하는 것으로 충분합니다.

find ./ -name '*.xml' | files=$(awk '{print $0}') ; echo $files

두 번째 문제는 파이프입니다. @cas가 지적했듯이 파이프는 자체 하위 쉘에서 실행됩니다. 따라서 변수 파일은 비어 있습니다. 이 문제를 해결하려면 awk를 제거하고 find 결과를 변수에 직접 저장하십시오.

files=$(find ./ -name '*.xml') ; echo "${files}" 

그러나 위 명령은 배열이 아닙니다. 배열로 만들려면 괄호를 사용하세요.

files=($(find ./ -name '*.xml')) ; echo "${files[0]}" 

해야합니다. 이제 ${files} 변수에 큰따옴표를 사용하는 것이 좋습니다. 그렇지 않으면 파일 이름에 공백이 있으면 문제가 발생할 수 있기 때문입니다. 그 외에도 다음 좋은 방법은 IFS를 사용하는 것입니다. 이렇게 하면 쉘이 공백이나 탭에서 토큰화되지 않습니다. IFS=$'\n'토큰화는 $files 변수에 내용을 저장하기 전에 새 줄( find 의 출력)에서 수행됩니다.

IFS=$'\n' files=($(find ./ -name '*.xml')) ; echo "${files[0]}" 

따라서 두 파일 또는 임의의 두 파일을 비교하는 마지막 명령은 다음과 같습니다.

files=($(find . -name '*.sh')) ; echo "${files[0]}" ; diff -y "${files[0]}" "${files[1]}"

여기서 0과 1은 배열( $files )의 유효한 숫자로 대체될 수 있습니다.

관련 정보