ファイルパスがあると仮定すると、コマンドラインでそのファイルのディレクトリをどのように参照しますか?

ファイルパスがあると仮定すると、コマンドラインでそのファイルのディレクトリをどのように参照しますか?

次のように入力できます。

dirname ~/home/blah/file.zip

たとえば、これはそれ自体はうまく機能しますが、この構文をいくつかのコマンドの引数として使用すると、常に "dirname"を希望のディレクトリに読み込みます。つまり:

cd dirname ~/home/blah/file.zip
bash: cd: dirname: No such file or directory

基本的に 'dirname'はどのように取得しますか?文書'をエンティティとして解釈しますか?

答え1

cd "$(dirname ~/home/blah/file.zip)"

$(コマンド置換の一形態です。これバッシュガイドウィキこのプロセスに関する良い情報があります。

答え2

(他の回答にすでに表示されているコマンド置換機能を繰り返さないでください。)

これが頻繁に発生する場合は、関数を定義できます。たとえば、次のように入力します~/.bashrc

d () {
  if ! [ -d "$1/." ]; then
    set -- "${1%/*}"
  fi
  cd -- "$1"
}

d /path/to/directoryこの定義を使用すると、指定されたディレクトリに変更を実行するか、指定されたd /path/to/fileファイル(たとえば/path/to

この特定のコマンドでは、コマンドを編集して最後の単語を削除できます。主キーバインディングを使用して行の末尾から始め、Alt+を押してB前の単語に戻り、Alt+を押してD右の単語を削除します。ほとんどの端末では、行の末尾から始まり、を押してEsc Backspace左側の単語を削除できます。

pathがディレクトリの場合~/home/blah/subdir/..と同じディレクトリを指定してください~/home/blah

zshでは、(:h)パスの末尾にタグを追加してファイル名を削除し、ディレクトリ部分のみを保持できます。 (h「head」に対して機能し、t「tail」はファイル部分のみを保持します。)他のものを使用できます。歴史的修正(:…)パスやグローブの後ろに。

cd ~/home/blah/file.zip(:h)

答え3

Chrisが推奨するフォームは"$(cmd)"最も安全ですが、このフォームは入力しやすく、通常はうまく機能します。

$ cd `dirname ~/home/blah/file.zip`

違いはバックティック形式です。混乱する可能性がありますコマンドの特定の文字に従って拡張されます。示されているような単純なコマンドの場合、これが問題にならないことがすぐにわかります。任意のパラメータを受け入れる必要があるシェルスクリプトの場合、$()二重引用符を使用する方が安全です。

答え4

(コメントするには大きすぎるため、@gillesの答えに対する答えです。)

Gilesがすでに指摘したように、必要な機能を自動的に実行する関数を作成できます。ただし、これをオーバーライドし、代わりに任意の名前を使用することもできますcd

zshの場合:

cd() {
    if (( ${#argv} == 1 )) && [[ -f ${1} ]]; then
        builtin cd ${1:h}
    else
        builtin cd "$@"
    fi
}

バッシュの場合:

cd() {
    if [ $# == 1 ] && [[ -f ${1} ]]; then
        builtin cd "$(dirname ${1})"
    else
        builtin cd "$@"
    fi
}

cd /path/to/fileこれにより、ディレクトリを特定のファイルに自動的に変更する次のタスクを実行できます。もちろん、zshでbashバージョンを使用することもできます。

関連情報