폴더 비교


10

하위 폴더 구조가 비슷한 두 개의 폴더가 있는데 비교하고 싶습니다. 예를 들면 다음과 같습니다.

A 
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5

B 
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text

나는에서 모든 하위 폴더를 나열하고자 A하는 A의 하위 폴더에 대한 접두사 있습니다 B에서 하위 폴더를 대응 목록 B뿐만 아니라. 예상 출력은

child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing

보조 요구 사항 :에 여러 항목이 일치 B하면 오류 / 경고가 표시됩니다.

해결책 :

cd A
for f in `ls -d */`; 
do
    cd B;
    new_dirs=(`ls -1d $f*`);
    cd -;
    if [ ${#new_dirs[@]} -eq 0 ]
    then
        ## DO_Nothing
        continue;
    elif  [ ${#new_dirs[@]} -gt 1 ]
    then
        echo "Multiple matches to $f";
        continue;
    else
        echo "Unique Match found to $f -- ${new_dirs[0]}";
        continue;
    fi;    
done

문제:

$f해당하는 하위 폴더가없는의 값에 B대해 배열 구성에서 오류가 발생합니다. 예 :

ls : 'child-4 *'에 액세스 할 수 없습니다 : 해당 파일 또는 디렉토리가 없습니다.

질문

  • 이러한 오류를 제거하는 방법?
  • 거기에 더 나은 다음 목표 (들) 내 코드에서 하나를 달성하는 방법은?

미리 감사드립니다!


4
거의 작동하는 솔루션을 제공하는 +1!
user5325

이것은 특정 질문에 대한 답변이 아니지만 diff -rq DIR1 DIR2디렉토리 구조뿐만 아니라 파일 내용을 비교 하는 데 사용할 수 있습니다 .
jrw32982는 Monica

답변:


10

더 좋은 방법

파싱하지 마십시오ls . 대신 globs를 사용하십시오. 실제로 이미 글로브를 사용하고 있으며로 감싸는 것만으로도 ls의미가 없습니다. 당신은 필요가 nullglob없는 경기가 없을 때를 위해 켜져.

또한 피하는 cd것은 일을 단순화시킵니다.

#!/bin/bash

shopt -s nullglob

dir1=A
dir2=B

for dir in "$dir1"/*/; do
    basename="$(basename -- "$dir")"
    dirs_match=( "$dir2/$basename"*/ )
    case ${#dirs_match[@]} in
    0)
        ;;
    1)
        echo "Unique match for $dir: ${dirs_match[*]}"
        ;;
    *)
        echo "Multiple matches for $dir: ${dirs_match[*]}" >&2
        ;;
    esac
done

산출:

Unique match for A/child-1/: B/child-1-some-text/
Unique match for A/child-2/: B/child-2-more-text/
Multiple matches for A/child-3/: B/child-3-nothing/ B/child-3-something/

B/child-3-something보조 요구 사항을 테스트하기 위해 추가 했습니다. 테스트 할 디렉토리 구조를 만듭니다.

mkdir -p A/child-{1..5} B/child-{1-some-text,2-more-text,3-nothing,3-something,6-random-text,7-more-random-text}

그런데 ShellCheck 는 쉘 스크립트에서 문제를 찾는 데 매우 유용합니다.


ShellCheck.net은 흥미 롭습니다. 모든 것이 자체 서버에 업로드되는지 아니면 모두 로컬로 수행되는지 알고 있습니까? 입력 한 정보의 프라이버시가 궁금합니다. [ shellcheck패키지 설치가 가장 안전합니다]
Xen2050

@ Xen2050 사이트에있는 동안 인터넷을 끄려고했는데 업로드 한 것 같습니다. 나는 그것을 유지하지는 않지만 확실하지 않다고 상상할 것입니다. 그렇습니다. 포장은 좋습니다. 나는 그것을 사용 하는 Atom 플러그인 을 사용합니다.
wjandrea

제안 해 주셔서 감사합니다. 을 (를) 가리켜 주셔서 감사합니다 ShellCheck. 나는 그것이 당신에게 오류를 말할뿐만 아니라 제안을하는 부분을 좋아했습니다! @ Xen2050, 업로드 부분에 대해 방금 네트워크를 사용 shellcheck하여 설치 apt한 다음 비활성화했습니다. 인터넷없이 작동하는 것 같습니다 .
Mike VDC

2

ls존재하지 않는 폴더를 호출 하면 발생한 오류 메시지가 표시됩니다. 쉬운 방법은 스크립트의 5 행을 다음과 같이 바꾸어이를 무시하는 것 new_dirs=(`ls -1d $f* 2> /dev/null`);입니다.


이것을 테스트 했습니까? Stderr는 기본적으로 무시되는 것처럼 보입니다. t=(`echo ok; echo err 1>&2`)$ t (또는 ${t[@]})에 ok 만 포함되어 있으면 터미널에 오류가 표시되지만 어쨌든 저장되지는 ​​않습니다. 아니면 내 테스트에 재미있는 것이 있습니까?
Xen2050
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.