2014-01-29 4 views
0

이 프로그램 :쉘 스크립트 - 대소 문자를 구분하지 일치

#!/bin/bash 

find teste1 -type f -iname "**" | while read -r firstResult 
do 
find teste2 -type f -iname "**" | while read -r secondResult 
do 
firstName=${firstResult##*[/|\\]} 
secondName=${secondResult##*[/|\\]} 
if [[ $firstName == $secondName ]]; then 
echo "$firstResult" "$secondResult" >> equal.lst 
else 
echo "$firstResult" "$secondResult" >> notEqual.lst 
fi 
done 
done 

I 폴더이 예제로있을 때, 그것은, 그러나, 아주 좋아, 작업의 IT와 약간의 문제가 오전 :/teste1/TESTE .pub /teste2/TEstE.pub 파일을 "동등"하지 않습니다. 어떻게해야합니까? 대소 문자를 구별하지 않고 찾기를 시도했는데 작동한다는 것을 의미하지만 인식하지 못합니다.

도와주세요.

어쩌면 모든 파일 이름을 하나의 사례로 "변환"한 다음 해당 검색을 수행해야합니까? 그게 내 문제를 해결할 것이라고 생각하니? 논리의 관점에서 볼 때 모든 파일은 동일한 케이스를 사용하기 때문에 작동합니다.

답변

1

tr을 사용할 필요가 없으며 bash는 자체 대소 문자 변환 (${var,,})을 사용합니다. 또한 find를 사용하여 -iname **을 사용할 필요가 없으며 기본적으로이 파일을 모든 파일과 일치시킵니다.

#!/bin/bash 

find teste1 -type f | while read -r firstResult 
do 
    find teste2 -type f | while read -r secondResult 
    do 
    firstName="${firstResult##*[/|\\]}" 
    secondName="${secondResult##*[/|\\]}" 

    if [[ "${firstName,,}" == "${secondName,,}" ]]; then 
     echo "$firstResult" "$secondResult" >> equal.lst 
    else 
     echo "$firstResult" "$secondResult" >> notEqual.lst 
    fi 
    done 
done 
+0

그것은 다음을 제공합니다 -> teste.sh : $ {firstName을 ,,} :이 스크립트에서 다른 버그로 인해 생각하는 나쁜 대체 – Gabriel

+0

, 당신의'read'이 서브 쉘에서 실행 생각 . 내가 맞다면 당신의 대답은 비어있는'.lst' 파일을 줄 것입니다. 이걸 확인하는 동안 기다려주세요 ... – Graeme

+0

흠 .. ".lst"는 비어 있지 않았고 항상 파일을 저장했습니다. 문제는 전체 ".lst"파일보다 먼저 발생합니다. 내가 얻은 버그는 'if'명령이나 그것이 나에게 보이는 것입니다. – Gabriel

1

좋아, 그래서 모든 파일 이름을 소문자로 변경하여 문제를 해결했습니다.

#!/bin/bash 

find teste1 -type f | tr [A-Z] [a-z] | while read -r firstResult 
do 
find teste2 -type f | tr [A-Z] [a-z] | while read -r secondResult 
do 
firstName=${firstResult##*[/|\\]} 
secondName=${secondResult##*[/|\\]} 
if [[ $firstName == $secondName ]]; then 
echo "$firstResult" "$secondResult" >> equal.lst 
else 
echo "$firstResult" "$secondResult" >> notEqual.lst 
fi 
done 
done 

이제 필자가 원하는대로 파일을 일치시키고 저장합니다. 다른 사람들이 궁금한 점이있는 경우 FIND에서 대소 문자를 구분하려면 tr [A-Z] [a-z] 명령을 제거하면됩니다.