Unix シェル (具体的には Ubuntu) で、ls コマンドから出力された x 番目のディレクトリにディレクトリを変更する方法はありますか? ディレクトリを複数の方法で並べ替えることができることは知っていますが、ls の出力を使用して x 番目のディレクトリを取得することはできますか?
シェルの例:
$ ls
$ first_dir second_dir third_really_long_and_complex_dir
ここで、3 (または適切な配列形式では 2) を渡して third_really_long_and_complex_dir に移動します。単純にコピーして貼り付けることもできますが、すでにキーボードを使用している場合は、インデックスがわかっていれば、「cdls 2」などと入力する方が簡単です。
アップデート
まだこれを見ている人のために言っておくと、私がこの質問を作成したのは、Linux/bash を使い始めたばかりの頃で、タブ補完というものがあることを知らなかったからです。
答え1
対話型セッションでの主な問題cd
は、通常、コマンド プロンプトを処理しているシェルの現在のディレクトリを変更する必要があることです。つまり、サブシェル (スクリプトなど) を起動しても、呼び出しがcd
親シェルに影響を与えないため、役に立ちません。
ただし、使用しているシェルによっては、関数これを実行するには、次のようにします。たとえば、bash の場合:
function cdls() {
# Save the current state of the nullglob option
SHOPT=`shopt -p nullglob`
# Make sure that */ expands to nothing when no directories are present
shopt -s nullglob
# Get a list of directories
DIRS=(*/)
# Restore the nullblob option state
$SHOPT
# cd using a zero-based index
cd "${DIRS[$1]}"
}
この例では、出力を解析することを絶対に拒否していることに注意してくださいls
。いくつかの理由により代わりに、シェル自体にディレクトリのリスト (またはディレクトリへのリンク) を取得させます...
とはいえ、この機能(またはこれに類するもの)を使うと、間違ったディレクトリに移動した後に を使うなど、大きな混乱を招く可能性が高いと思いますrm
。ファイル名の自動補完は、自分で入力しなくても十分危険です。カウント...
答え2
これには次の関数があります:
関数 cdi.{ IFS=$'\n' ページ=${1:-1} LPP=${2:-11} 最初=$(( 1 + LPP * ページ - LPP )) 最後=$(( LPP * ページ )) $(find で cd_into を選択。-maxdepth 1 -type d -printf "%P\n" |\ sed -n $first,${last}p); する 終了=-1; if [[ $REPLY == n ]]; then let PAGE=PAGE+1; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == p ]]; then let PAGE=PAGE-1; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == m ]]; then let LPP=LPP*2; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == l ]]; then let LPP=LPP/2; cdi. $PAGE $LPP ; EXIT=$? elif [[ $REPLY == q || $REPLY == 0 ]];その後0を返します。 if [ $EXIT -eq 0 ]; then 0を返す; fi cd_into=${cd_into//\~/$HOME} if [ -d "$cd_into" ];then cd "$cd_into"; 0を返す; そうでない場合 echo "おっと!\`$cd_into' はフォルダではありません(?)" フィ 終わり IFSの設定を解除 }
使用方法:
$cdi。 1) .mozilla.new 3) .swt 5) tmp 7) .vim 9) .ssh 2) .crack-attack 4) ダウンロード 6) .Eterm 8) .frozen-bubble 10) .irssi どれの #?: