pushd/popd パスから重複排除

pushd/popd パスから重複排除

コンテキスト

  • Linux バッシュ
  • プッシュ/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
}

おすすめ記事