pushd/popd 경로에서 중복 제거

pushd/popd 경로에서 중복 제거

문맥

  • 리눅스 배쉬
  • 푸시/POPD/디렉토리

질문

문제 시나리오는 이 질문에 설명된 것과 매우 유사합니다.popd/pushd 경로 스택 삭제 또는 지우기...하지만 목표는 스택을 지우는 것이 아니라치다그것. 구체적으로 정리 작업은 중복 항목을 제거하는 것입니다.

질문

dirs -v -p스택에 중복이 없도록 출력을 자르는 간단한 방법이 있습니까 ?

답변1

이 기능은 중복을 제거해야 합니다.

dedup(){
    declare -a new=() copy=("${DIRSTACK[@]:1}")
    declare -A seen
    local v i
    seen[$PWD]=1
    for v in "${copy[@]}"
    do if [ -z "${seen[$v]}" ]
       then new+=("$v")
            seen[$v]=1
       fi
    done
    dirs -c
    for ((i=${#new[@]}-1; i>=0; i--))
    do      builtin pushd -n "${new[i]}" >/dev/null
    done
}

디렉터리 목록(첫 번째 디렉터리는 가짜이기 때문에 첫 번째 디렉터리 제외)을 배열로 복사하고 copy, 각 디렉터리에 대해 new아직 해당 디렉터리를 배열(연관 배열)에 추가하지 않은 경우 seen배열에 추가합니다. 이렇게 하면 이전 중복 항목(배열의 뒷부분에 있음)이 복사되지 않습니다. 디렉토리 목록이 지워지고 배열이 pushd역순으로 정렬됩니다.

dirs 목록의 첫 번째 가짜 요소는 변경되지 않은 현재 디렉터리입니다. 배열의 시작 부분에 설정되어 있으며 seen디렉터리 목록에서 앞에 있으면 제거할 수도 있습니다.

이 작업을 자동으로 수행하려면 다음 pushd과 같이 재정의할 수 있습니다.

pushd(){
    builtin pushd "$@"
    dedup
}

관련 정보