- ディレクトリのフルファイル名を取得するには?
- ファイルパスにもルートディレクトリを含めないでください。
答え1
POSIXly、パス(現在のディレクトリへの相対パス、シンボリックリンクを含む)が格納されているディレクトリのシンボリックリンクされていない絶対パスを取得するには、次のものが$dir
あります。探すディレクトリに対する権限を取得するには、次の手順を実行します。
(
case $dir in
(/*) CDPATH= cd -P "$dir";;
("") CDPATH= cd -P "";;
(*) CDPATH= cd -P "./$dir";;
esac && pwd -P
)
以下は、以下からそのままコピーされました。このテキストは、POSIX 仕様の次のバージョンに含まれる予定です。。
ここで言及されているように、この場合、現在指定されていない動作に依存""
または作成するのではなく、エラーを印刷できます。cd
(
case "${dir:?directory cannot be empty}" in
(/*) CDPATH= cd -P "$dir";;
(*) CDPATH= cd -P "./$dir";;
esac && pwd -P
)
絶対的でない場合、プレフィックス$dir
withは起動時にオプションと見なされず./
(十分)意味として解釈されない特別な値に使用されます。$dir
-
CDPATH= cd -P -- "${dir:?cannot be empty}"
-
cd
$OLDPWD
以前の作業ディレクトリ(そしてCDPATH= OLDPWD=- cd -P -- "${dir:?cannot be empty}"
この問題を解決するためにポータブルでは使用できません)。
一つの状況は目次現在のディレクトリで親ディレクトリから切断されている場合、絶対パスはありません。
$ mkdir 1
$ cd 1
$ rmdir ../1
$ cd -P .
$ ls -ld .
drwxr-xr-x 0 chazelas chazelas 0 Mar 27 06:53 ./
$ [ -d . ] && echo yes
yes
しかし、まだ存在します。
$ pwd -P
.
$ realpath .
realpath: .: No such file or directory
$ readlink -ve .
readlink: .: No such file or directory
ファイルシステムにパスがありません。
これそのファイルやディレクトリはありません。errorはディレクトリが存在するため、少し誤解を招くことが.
ありますが(たとえそれで多くのことはできませんが)、少なくともLinuxではerrnoをgetcwd()
返すとENOENT
現在のディレクトリが切断されたことを示します。
答え2
相対パスは現在のディレクトリに相対的であるため、ルートディレクトリは含まれません。
例:
development/project/src
src
現在のディレクトリの下の2段階のディレクトリと呼ばれる相対パスです。パスは、src
ディレクトリ名、ファイル名、または別の名前であることを示しません。
Linuxシステムでは、このrealpath
ユーティリティを使用して名前のフル(絶対)パスを取得できます。
$ realpath development/project/src
/home/myuser/work/development/project/src
絶対パスは常にルートディレクトリから始まります。より正確には、現在のプロセスのルートディレクトリから始まり、コマンドを使用して変更できますchroot
。
ほとんどのUnixシステムでは、現在のディレクトリから始まる相対パスの前にプレフィックスを付けて絶対パスを取得できます$PWD
。
$ printf '%s\n' "$PWD/development/project/src"
/home/myuser/work/development/project/src
ただし、これは単なる文字列接続であり、まったく同じ方法でパスをチェックしませんrealpath
。与えられた相対パスが正しい場合、機能的絶対パスが提供される。