2012-07-03 5 views
0

다른 이름의 두 파일을 서로 다른 디렉토리에있는 bash 스크립트를 작성하려고합니다.중첩 된 for 루프 비교 파일

나는 diff -r을 사용하여이 작업을 수행 할 수 있음을 알고 있지만 첫 번째 파일에없는 두 번째 파일에있는 모든 파일을 가져 와서 새 파일로 출력합니다 (동일한 파일 이름)

나는 grep 명령과 함께 (중첩) 루프를 작성했습니다하지만이 좋지 않아 및 구문 오류를 다시 제공합니다

#!/bin/bash 
FILES=/Path/dir1/* 
FILES2=/Path/dir2/* 

for f in $FILES 
do 
for i in $FILES2 
do 
if $f = $i 
grep -vf $i $f > /Path/dir3/$i 

done 
done 

어떤 도움을 많이 감사합니다. 쉘의 구문은 test_command 종료 코드가 0

if [ $f = $i ] ; then grep ... ; fi 

경우

if test_command;then commands;fi 

명령이 실행되는 경우

답변

1

#!/bin/bash 
cd /Path/dir1/ 
for f in *; do 
    comm -13 <(sort $f) <(sort /Path/dir2/$f) > /Path/dir3/$f 
done 

을 시도하지만 귀하의 경우에 더 효율적입니다 파일 이름을 얻으려면

마지막으로
for i in $FILES; do 
    f=/Path/dir2/`basename $i` 
    grep 
done 

은, 어쩌면이보다 더 효율적입니다 그렙 -v

comm -13 <(sort $f) <(sort $i) 

통신 -13 첫번째에서 두번째로하지에 모든 것을 얻을 것이다; comm을 사용하지 않고 comm 명령을 실행하면 3 열의 출력이 생성됩니다. 첫 번째는 처음에는 두 번째이고 두 번째는 일반적인 것입니다. -13 -1 -3 첫 번째와 세 번째 열을

+0

lovely, this has been done 나는 그것을 고수 하겠지만 모두에게 감사드립니다. – jksl

0
#!/bin/bash 
DIR1=/Path/dir1 
DIR2=/Path/dir2 
DIR3=/Path/dir3 

for f in $DIR1/* 
do 
    for i in $DIR2/* 
    do 
    if [ "$(basename $f)" = "$(basename $i)" ] 
    then 
     grep -vf "$i" "$f" > "$DIR3/$(basename $i)" 
    fi 
    done 
done 
+0

고맙습니다. 내 원래와 가장 가까워서 더 이해하기 쉽기 때문에 시도해 봤습니다.) 기본 형식으로 작동하지 않았으므로 기준 이름이 키이므로 깨닫게되었습니다. 'code' #!/빈/bash는/* $ DIR1에서 F에 대한 'code'DIR1은 = /에 Path1/ 'code'DIR2은 =/경로 2/ 'code'DIR3은 =/경로 3가/ 'code'' code'은/* ' 할 code''code' 경우 [ "은 $ DIR1/$ (기본 이름을 $의 F)"= "$ DIR2/$ (기본 이름을 $의 ⅰ)"] $ DIR2에 난 위해 'code' 할 grep -vf "$ i" "$ f"> "$ DIR3/$ (basename $ i)" fi 'code' 완료 'code' done 그러나 아직 출력이 없으며 내가하는 일을 확신 할 수 없습니다. – jksl

+0

오, 그냥 그게 뭔지 깨달았습니다. 루프에서'$ f'는'/ Path/dir1/'이되고'$ i'는'/ Path/dir2/'이됩니다. 물론 둘은 동일하지 않습니다. 나는 그것을 고쳤다, 다시 시험해 보라. – vergenzt

+0

예, 그게 내가 말하려고했던 것입니다. 편집이 아름답게 작동합니다. 출력이 이미 나를 위해 정렬되어 있기 때문에 @Nahuel Fouilleul하여 솔루션을 사용했습니다! – jksl

0

이 파일 이름에 특수 문자을지지 않습니다를 제거합니다. 공백 문자가 허용되지 않는 경우에는 큰 따옴표를 사용하십시오.) :

+0

고맙습니다. 나는 매우 이상한 결과물을 얻지 못하고있다.이 작업을 수동으로 수행하기 시작한 파일에는 분명히 다른 (그리고 유사한) 행이 있습니다. 내가 뭘 잘못하고 있는지 모르겠다. – jksl

+0

@jksl 사소한 편집 : 선행 경로를 자르려면'# '대신'##'을 사용하십시오. –