현재 디렉토리에 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 )의 유효한 숫자로 대체될 수 있습니다.