ファイルパラメータをインポートしてそのディレクトリに移動しますか? [コピー]

ファイルパラメータをインポートしてそのディレクトリに移動しますか? [コピー]

ファイル引数を受け入れ、引数のファイル部分を完全に無視してインクルードディレクトリに移動するUnixコマンドまたはシェルスクリプトはありますか?

答え1

次の関数を作成できます。

cd_to_file_location() {                          
    location=$(dirname -- "$1")
    cd -- "$location"
}

# test it out
$ mkdir /tmp/foodir
$ touch /tmp/foodir/a
$ cd_to_file_location /tmp/foodir/a 
$ pwd
/tmp/foodir

答え2

存在するzsh

cdparent() cd -- $1:h

現在の作業ディレクトリを最初の引数のディレクトリ部分(ead)に変更する関数がcdparent定義されています。h

次のようにすることもできます。

cd some/file(:h)

ここでも、:hglob修飾子は与えられたファイルのヘッダーを検索するために使用されます。

この:h修飾子は1970年代のcshに由来し、パラメータの拡張と履歴の交換に使用できます。では、zshグローバル修飾子が追加される状況に適用できます。では、bash履歴の交換にのみ適用できます。これらの修飾子の一部は、たとえば現在編集されているファイルのディレクトリにchdirを送信できる場合にも:h使用できます。vim:cd %:h

(これ上記の表現は少し誤解を招く可能性があります。たとえば、これはaの代わりにcdparent ..aを実行します。cd .cd ../..提案可能)。

答え3

宛先パスがディレクトリであることを確認する関数を使用できます。それ以外の場合は、パスからディレクトリ名を取得し、そのディレクトリにCDを送信します。たとえば、

mycd()
{
    if [ ! $# -eq 1 ]
    then
        printf "Usage: mycd <PATH>\n" >&2
        return
    fi

    if [ ! -d "$1" ]
    then
        dest="$(dirname -- "$1")"
        set -- "$dest"
    fi

    cd -- "$1"
}

これはディレクトリとファイルパスを処理するのに十分一般的であり、実際のものを使用するので、次を使用してcdいつでも古いディレクトリに戻ることができますcd -

$ mkdir /tmp/test-dir/
$ touch /tmp/test-dir/FILE
$ mycd /tmp/test-dir/FILE
$ pwd
/tmp/test-dir
$ mycd /tmp/
$ pwd
/tmp
$ cd -
/tmp/test-dir
$ pwd
/tmp/test-dir

答え4

あなたはそれを探していますか?

cd "${dirname "$1"}"

pushd必要に応じて代わりに使用することもできます。cd

関連情報