コンテキスト
- 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
}