bashでファイルのフルパスを取得する方法は?


21

ファイルへの完全なパスを取得する簡単な方法が欲しいです。私は現在これを入力します:

echo `pwd`/file.ext

短縮しようとして、bashエイリアスを作成しました。

alias fp='echo `pwd`/'

しかし、今私がタイプするならfp file.ext/との間に現れるスペースがありますfile.ext

そのようなコマンドはすでに存在しますか?そうでない場合、bashでそのようなエイリアスまたは関数を作成するにはどうすればよいですか?

回答:


29

Linuxシステムでreadlinkは、GNU coreutilsプロジェクトからインストールする必要があり、これを行うことができます。

readlink -f file.ext

Debian / ubuntuシステムには、「coreutilsパッケージとほぼ同じ機能を提供する」realpathユーティリティがインストールされている場合があり/bin/readlink -fます。


readlink -f(またはrealpath、互換性のために保持されている古いユーティリティ)は、すべてのシンボリックリンクをさらに拡張しますが、これは必ずしも望ましくありません。
ジル 'SO-悪であるのをやめる'

8
fyi:macosxでは機能しません。
アキラ

私のMacでは、homebrewを使用してcoreutilsをインストールしましたrealpath
ダグ・ハリス

7

pwdコマンドの代わりに、PWD変数を使用します(POSIXにもあります)。

fp () {
  case "$1" in
    /*) printf '%s\n' "$1";;
    *) printf '%s\n' "$PWD/$1";;
  esac
}

Windowsをサポートする必要がある場合、unixツールの各ポートにはファイルパスを変換するための独自のルールがあるため、絶対パスの認識はより複雑になります。Cygwinでは、cygpathユーティリティを使用します。


たぶんそれはあなたの選択ですが、この関数は新しい行を出力しません。
cYrus

このアプローチには、シェル組み込みコマンドのみを使用するという利点があり、外部バイナリを呼び出すよりも高速です。この事実をもう少し明確にする必要があります。
アキラ

4

あなたが今使っているものであなたの質問に答えるために:

エイリアスは、現在入力している位置で展開されます。入力した:

% fp<SPACE>file.ext

これはなる

% echo `pwd`<SPACE>file.exe

あなたはそれを避けるために関数を使用することができます:

function fp() {
    echo `pwd`/"$1"
}

通常どおり使用できます:

% fp file.ext

:あなたは、変数やコマンド置換は二重引用符で囲む必要があるecho "`pwd`/$1"
ジル「SO-停止されて悪」

@Gilles:どのような状況下ですか?
アキラ

2
@akira:展開の結果をグロビングパターンとして扱い、グロビングの結果を単語に分割する場合を除き、常に二重引用符を使用します。ここでは、単一のファイル名を作成しているため、二重引用符が必要です(*他のファイルを含むディレクトリで呼び出されるファイルで関数を試してください)。
ジル 'SO-悪であるのをやめる'

' 'はシェル(私の場合はzsh)によってグロブされ、関数に到達する前に展開されます。fp *それが/tmp/4cc3ea0c1b34b関数の最初のパラメーターであるため、次の値を返します。他のパラメーターは、ディレクトリ内の他のファイルになります。すぐに私は「と呼ばれるファイルを持っているとしてとして期待通り」関数は、まだ「*」または*または*それを呼び出して、作品
アキラ

bashはここでの「悪い」もので、bashはあなたが参照しているものを生成します。
アキラ

3

次を使用できます。

realpath file.ext

私はそれを持っていません。それはどこから来たのですか?
狂気

@frabjous:これはDebianと派生物に固有のものであり、リクエストするか、依存するパッケージをリクエストした場合にのみインストールされます。
ジル 'SO-悪であるのをやめる'

私はArchを使用しています。Debianベースではありませんが、とにかくAURにパッケージがあります。既にreadlinkを持っている場合、インストールする価値があるかどうかはわかりません。
派手な

まあ、それはオプションです。または、関数を検討することもできます。Gillesの回答を参照してください。とにかく、あなたがそれでやりたい本当の用途に依存している(私は興味がある)。
cYrus

@frabjous:使用しているシステムを指定しませんでしたが、Aptitudeベースのパッケージマネージャー(Debian、Ubuntu、Mintなど)を使用している場合は、入力apt-cache search realpathしてcoreutilsおよびプレーンol ' realpathパッケージであることを明らかにできます両方とも含まれています。その後、sudo apt-get install realpath(またはcoreutils)を入力してインストールできます。
マイケルシェパー

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.