システムが管理する複数のディレクトリを切り替えるためのクイックコマンドライン方法は何ですか?私の言葉は、pushd .
andを使ってpopd
切り替えることができますが、スタックの一番下から永久に取り出すのではなく、複数を保存して繰り返すにはどうすればよいですか?
答え1
bash
pushd
に内蔵+
そして-
オプションはディレクトリスタックを回転させることができます。構文は多少混乱する可能性があります。おそらく、スタックが次のようになるからです。若い配列に基づいています。これらの単純なラッパー関数はディレクトリスタックを繰り返します。
# cd to next directory in stack (left rotate)
ncd(){ pushd +1 > /dev/null ; }
# cd to previous directory in stack (right rotate)
pcd(){ pushd -0 > /dev/null ; }
テスト:4つのディレクトリスタックを設定します。
dirs -c # clear directory stack
cd /home ; pushd /etc ; pushd /bin ; pushd /tmp
今/tmpは現在のディレクトリであり、スタックは次のとおりです。
/tmp /bin /etc /home
スタックの次のディレクトリに4回変更して表示します。
ncd ; pwd ; ncd ; pwd ; ncd ; pwd ; ncd ; pwd
出力:
/bin
/etc
/home
/tmp
スタックの前のディレクトリに4回変更して表示します。
pcd ; pwd ; pcd ; pwd ; pcd ; pwd ; pcd ; pwd
出力:
/home
/etc
/bin
/tmp
についてcd -
:ワイルドカード回答ヘルプでは、cd -
使用しない方法について説明します。$DISTACK配列(これは$OLDPW変数)cd -
影響を与えないように$DISTACKスタックベースの交換はこのように行わなければなりません。この問題を解決するには、次の簡単な方法を使用してください。$DISTACK- ベース交換機能:
scd() { { pushd ${DIRSTACK[1]} ; popd -n +2 ; } > /dev/null ; }
テスト:
dirs -c; cd /tmp; \
pushd /bin; \
pushd /etc; \
pushd /lib; \
pushd /home; \
scd; dirs; scd; dirs
出力:
/bin /tmp
/etc /bin /tmp
/lib /etc /bin /tmp
/home /lib /etc /bin /tmp
/lib /home /etc /bin /tmp
/home /lib /etc /bin /tmp
答え2
pushd
次に、ディレクトリスタック内のディレクトリの特殊名(など)を使用します~1
。~2
例:
tmp $ dirs -v
0 /tmp
1 /tmp/scripts
2 /tmp/photos
3 /tmp/music
4 /tmp/pictures
tmp $ cd ~3
music $ dirs -v
0 /tmp/music
1 /tmp/scripts
2 /tmp/photos
3 /tmp/music
4 /tmp/pictures
music $ cd ~2
photos $ cd ~4
pictures $ cd ~3
music $ cd ~1
scripts $
これを使用する最も効率的な方法pushd
はディレクトリリストをロードしてからもう一つ追加そのディレクトリは現在のディレクトリになり、スタック内のディレクトリの場所に影響を与えることなく静的番号間を移動できます。
cd -
最後にあったディレクトリに移動するという点も注目する価値があります。そうだろうcd ~-
。
~-
justよりも利点はに固有ですが、次に拡張される-
ことです。-
cd
~-
あなたの殻を通して~1
~2
などと同じです。これは、非常に長いディレクトリパス間でファイルをコピーするのに役立ちます。たとえば、次のようになります。
cd /very/long/path/to/some/directory/
cd /another/long/path/to/where/the/source/file/is/
cp myfile ~-
上記の式は次のとおりです。
cp /another/long/path/to/where/the/source/file/is/myfile /very/long/path/to/some/directory/
答え3
インストールすることをお勧めします。ファシスト党員。ディレクトリ名の一部だけを入力すると、すでに存在するディレクトリにすばやく移動できます。
例:訪問した場合は、例を入力すると/home/someName/scripts/
そのページに移動します。z scr
これは、履歴スタックや同様の順序を覚えているよりもはるかに便利です。
答え4
xyzzy
私はこれのためにスクリプトを書いた:
#!/bin/bash
i="$1"
i=$((${i//[^0-9]/}))
i="$(($i-1+0))"
b="$2"
b=$((${b//[^0-9]/}))
b="$(($b-1+0))"
if [ -z "$XYZZY_INDEX" ]; then
XYZZY_INDEX="$((-1))"
fi
if [ ! -f "/tmp/xyzzy.list" ]; then
touch /tmp/xyzzy.list
chmod a+rw /tmp/xyzzy.list
fi
readarray -t MYLIST < /tmp/xyzzy.list
showHelp(){
read -r -d '' MYHELP <<'EOB'
xyzzy 1.0
A command for manipulating escape routes from grues. Otherwise known as a useful system admin
tool for storing current directories and cycling through them rapidly. You'll wonder why this
wasn't created many moons ago.
Usage: xyzzy [options]
help/-h/--help Show the help.
this/-t/--this Store the current directory in /tmp/xyzzy.list
begone/-b/--begone Clear the /tmp/xyzzy.list file. However, succeed with a number and
it clears just that item from the stored list.
show/-s/--show Show the list of stored directories from /tmp/xyzzy.list
. # Use a number to 'cd' to that directory item in the stored list. This syntax is odd:
. xyzzy 2
...would change to the second directory in the list
. [no options] Use the command alone and it cd cycles through the next item in the stored
list, repeating to the top when it gets to the bottom. The dot and space before xyzzy
is required in order for the command to run in the current shell and not a subshell:
. xyzzy
Note that you can avoid the odd dot syntax by adding this to your ~/.bashrc file:
alias xyzzy=". xyzzy"
and then you can do "xyzzy" to cycle through directories, or "xyzzy {number}" to go to a
specific one.
May you never encounter another grue.
Copyright (c) 2016, Mike McKee <https://github.com/volomike>
EOB
echo -e "$MYHELP\n"
}
storeThis(){
echo -e "With a stroke of your wand, you magically created the new escape route: $PWD"
echo "$PWD" >> /tmp/xyzzy.list
chmod a+rw /tmp/xyzzy.list
}
begoneList(){
if [[ "$b" == "-1" ]]; then
echo "POOF! Your escape routes are gone. We bless your soul from the ever-present grues!"
>/tmp/xyzzy.list
chmod a+rw /tmp/xyzzy.list
else
echo -n "Waving your wand in the dark, you successfully manage to remove one of your escape routes: "
echo "${MYLIST[${b}]}"
>/tmp/xyzzy.list
chmod a+rw /tmp/xyzzy.list
for x in "${MYLIST[@]}"; do
if [[ ! "$x" == "${MYLIST[${b}]}" ]]; then
echo "$x" >> /tmp/xyzzy.list
fi
done
fi
}
showList(){
echo -e "These are your escape routes:\n"
cat /tmp/xyzzy.list
}
cycleNext(){
MAXLINES=${#MYLIST[@]}
XYZZY_INDEX=$((XYZZY_INDEX+1))
if [[ $XYZZY_INDEX > $(($MAXLINES - 1)) ]]; then
XYZZY_INDEX=0
fi
MYLINE="${MYLIST[${XYZZY_INDEX}]}"
cd "$MYLINE";
}
switchDir(){
MYLINE="${MYLIST[${i}]}"
cd "$MYLINE";
}
if [[ "$@" == "" ]];
then
cycleNext
fi;
while [[ "$@" > 0 ]]; do case $1 in
help) showHelp;;
--help) showHelp;;
-h) showHelp;;
show) showList;;
-s) showList;;
--show) showList;;
list) showList;;
this) storeThis;;
--this) storeThis;;
-t) storeThis;;
begone) begoneList;;
--begone) begoneList;;
*) switchDir;;
esac; shift
done
export XYZZY_INDEX
私が使用する方法は、/usr/bin
フォルダにコピーしてからchmod a+x
その上にコピーすることです。次に、~/.bashrc
下部に次の行を含めるようにrootおよびユーザーアカウントファイルを編集しました。
alias xyzzy='. xyzzy'
alias xy='. xyzzy'
「xy」はコマンドの省略形で、入力速度を上げるために使用されます。
その後、現在のディレクトリをリストに保存できます。
xyzzy this
...必要に応じて繰り返します。必要なディレクトリにこのリストを入力すると、コンピュータを再起動するまでそのディレクトリはそのまま残ります。その理由は、/ tmpが再び消去されるためです。それでは打者を打つことができます…
xyzzy show
...現在保存されているディレクトリを一覧表示します。ディレクトリに切り替えるには2つのオプションがあります。 1つのオプションは、次のようにインデックス(1から始まるインデックス)へのパスを指定することです。
xyzzy 2
...リストの2番目のエントリディレクトリに切り替えます。あるいは、インデックス番号を省略して次のようにすることもできます。
xyzzy
...必要に応じて各ディレクトリを循環させます。実行できるコマンドの詳細については、次のように入力してください。
xyzzy help
もちろん、私が追加した愚かなechoドアで作業する方が楽しいです。
xyzzyが正しいことに注意してください。巨大な洞窟xyzzyと入力すると、ゲーム内の2つの部屋を切り替えて問題を回避できるテキストアドベンチャーです。