
문맥
- 리눅스 배쉬
- 푸시/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
}