bash script > 두 디렉토리에 있는 같은 이름의 파일 찾기 > (문자열 바꾸기/diff로 찾는 방법) > RANDOM으로 처리/하지 않는다 > diff에서는 같은 이름으로 내용이 다른 파일을 찾을 수 없다

운영 환경
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
NCAR Command Language Version 6.3.0
WRF v3.7.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

다음을 수행하고 싶습니다.
  • 두 디렉토리에있는 동일한 이름의 파일 비교
  • 무작위로 꺼내기
  • 파일 (png 이미지)을 비교 한 HTML 파일 생성 (제목 포함)
  • pdf화

  • 목적은 WRF(Weather Research and Forecasting Model)로 처리한 결과 화상의 비교.

    v0.1 > 문자열 대체 + if [ -e



    두 디렉토리에 같은 이름의 파일이 있는지 확인하는 bash script를 구현해 보았습니다.

    참고 (문자열 바꾸기) htp // d. 하테나. 네. jp/오즈마/20130928/1380380390

    code



    compare_images_170127_exec
    #!/usr/bin/env bash
    
    #
    # v0.1 Jan,27,2017
    #   - find files in both directories
    #
    
    if [ $# -lt 2 ]; then
        echo "Usage:"
        echo "  [cmd] [source1 dir] [source2 dir]"
        echo "  to compare files with same names in 2 dirs"
        echo 
        exit
    fi
    
    src1dir=$1
    src2dir=$2
    
    #echo $src1dir
    #echo $src2dir
    
    for src1file in $(ls $src1dir/*.png);do
        # echo $src1file
        src2file=${src1file/$src1dir/$src2dir}
    
        if [ -e $src2file ]; then
            echo $src2file
        fi
    
        #break; // for debug
    done
    

    테스트 데이터 생성


    mkdir WORK_A
    mkdir WORK_B
    touch WORK_A/AAA.png
    touch WORK_A/BBB.png
    touch WORK_A/CCC.png
    touch WORK_A/DDD.png
    touch WORK_B/BBB.png
    touch WORK_B/DDD.png
    

    이것으로 BBB.png와 DDD.png만 공통이 된다.

    실행 예 > 인수 없음 (사용법 표시)


    $ bash compare_images_170127_exec 
    Usage:
      [cmd] [source1 dir] [source2 dir]
      to compare files with same names in 2 dirs
    

    실행 예 > 인수 있음 (파일 이름 표시)


    $ bash compare_images_170127_exec WORK_A WORK_B
    WORK_B/BBB.png
    WORK_B/DDD.png
    

    더 쉬운 방법



    있으면 알고 싶다.

    이었다.
    h tp : / / s t c ゔ rf ぉ w. 코 m / 쿠에 s 치온 s / 10087571 / ゔ ぇ ぇ ぉ ぢ れ c와 ry t ええ s ー ー ー ー ー ぃ ん ぃ ぃ ぃ ぇー사메
    $ diff -srq WORK_A WORK_B
    Only in WORK_A: AAA.png
    Files WORK_A/BBB.png and WORK_B/BBB.png are identical
    Only in WORK_A: CCC.png
    Files WORK_A/DDD.png and WORK_B/DDD.png are identical
    
    $ diff -srq WORK_A/ WORK_B/ | grep identical
    Files WORK_A/BBB.png and WORK_B/BBB.png are identical
    Files WORK_A/DDD.png and WORK_B/DDD.png are identical
    

    v0.2 > diff -srq



    diff -srq 사용

    code



    compare_images_170127_exec
    #!/usr/bin/env bash
    
    # v0.2 Jan,27,2017
    #   - use [diff -srq] 
    # v0.1 Jan,27,2017
    #   - find files in both directories
    #
    
    if [ $# -lt 2 ]; then
        echo "Usage:"
        echo "  [cmd] [source1 dir] [source2 dir]"
        echo "  to compare files with same names in 2 dirs"
        echo 
        exit
    fi
    
    src1dir=$1
    src2dir=$2
    
    res=$(diff -srq $src1dir $src2dir | grep identical | awk '{print $2}')
    for afile in $res;do
        echo $afile
    done
    

    상기 20 행의 print $2에 의해 src1dir 측의 파일명을 취득한다.
    (Note: 코드의 20행째, 라고 하는 것은 Q Accelerator (을)를 사용하면(자), 곧바로 볼 수 있습니다).

    결과
    $ bash compare_images_170127_exec WORK_A WORK_B
    WORK_A/BBB.png
    WORK_A/DDD.png
    

    v0.3 > 처리/없음 선택 > RANDOM 사용



    code



    compare_images_170127_exec
    #!/usr/bin/env bash
    
    # v0.3 Jan,27,2017
    #   - add condition using $RANDOM to process or not
    # v0.2 Jan,27,2017
    #   - use [diff -srq] 
    # v0.1 Jan,27,2017
    #   - find files in both directories
    #
    
    if [ $# -lt 2 ]; then
        echo "Usage:"
        echo "  [cmd] [source1 dir] [source2 dir]"
        echo "  to compare files with same names in 2 dirs"
        echo 
        exit
    fi
    
    src1dir=$1
    src2dir=$2
    
    THRESHOLD=16384 # should be <= [32767]
    # set smaller to increase the probability
    # set larger to decrease the probability
    
    res=$(diff -srq $src1dir $src2dir | grep identical | awk '{print $2}')
    for afile in $res;do
        if  [ $RANDOM -lt $THRESHOLD ]; then
            continue
        fi
        echo $afile
    done
    

    실행
    $ bash compare_images_170127_exec WORK_A WORK_B
    $ bash compare_images_170127_exec WORK_A WORK_B
    WORK_A/DDD.png
    $ bash compare_images_170127_exec WORK_A WORK_B
    WORK_A/BBB.png
    

    diff에서 안 됨 > 동일한 파일 만 검색에서 찾을 수 있습니다.



    같은 파일명으로, 작성 일시가 다른 (게다가 내용도 조금 다른) 파일은 diff -srq 에서는 발견되지 않는다고 깨달았다.

    v0.5 > diff -srq 중지 / html 출력



    code



    compare_images_170127_exec
    #!/usr/bin/env bash
    
    # v0.5 Jan,27,2017
    #   - remove [diff -srq] because diff only picks up "the same file"
    # v0.4 Jan,27,2017
    #   - add html_output()
    # v0.3 Jan,27,2017
    #   - add condition using $RANDOM to process or not
    # v0.2 Jan,27,2017
    #   - use [diff -srq] 
    # v0.1 Jan,27,2017
    #   - find files in both directories
    #
    
    html_output() {
        in1file=$1
        in2file=$2
        echo "$in1file<br>"
        echo -n "<table>"
        echo -n "<tr>"
        echo -n "<td>"
        echo -n "<img src=$in1file width=300></img>"
        echo -n "</td>"
        echo -n "<td>"
        echo -n "<img src=$in2file width=300></img>"
        echo -n "</td>"
        echo -n "</tr>"
        echo -n "</table>"
        echo 
    }
    
    if [ $# -lt 2 ]; then
        echo "Usage:"
        echo "  [cmd] [source1 dir] [source2 dir]"
        echo "  to compare files with same names in 2 dirs"
        echo 
        exit
    fi
    
    src1dir=$1
    src2dir=$2
    
    THRESHOLD=16384 # should be <= [32767]
    # set smaller to increase the probability
    # set larger to decrease the probability
    
    for src1file in $(ls $src1dir/*.png);do
        #echo $src1file
        src2file=${src1file/$src1dir/$src2dir}
    
        if [ -e $src2file ]; then
            if  [ $RANDOM -lt $THRESHOLD ]; then
                continue
            fi
            #echo $src2file
            html_output $src1file $src2file
            #break; // for debug
        fi
    done
    

    처리 결과



    화상 사이즈는 적절히 조정한다.



    2개의 차이는 무엇에 기인하는 것인가.
    모야모야.

    TODO 목록



    두 디렉토리에있는 동일한 이름의 파일 비교
    무작위로 꺼내기
    파일 (png 이미지)을 비교 한 HTML 파일 생성 (제목 포함)
    pdf화

    좋은 웹페이지 즐겨찾기