回答:
brew install coreutils
からgreadlink -f file.txt
Linuxを使用していると思います。
realpath
coreutils 8.15で呼び出されるユーティリティを見つけました。
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
@ styrofoam-flyと@ arch-standtonのコメントに従って、realpath
単独ではファイルの存在をチェックしないため、これを解決するにはe
引数を追加します。realpath -e file
realpath
2011年末にcoreutilsレポにコミットし、リリース8.15は2012年1月に行われ、readlink
2011年3月に(提案とともに)質問に回答しました:)
realpath -e
は、引数が存在しない場合にエラーを出力します。
通常は次の方法で対処できます。
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
ファイルがシンボリックリンクの場合は機能しないため、シンボリックリンク自体ではなく、シンボリックリンクのターゲットが表示されます。
readlink
シンボリックリンクの生成元の親ディレクトリに戻るはですが、無視されます。
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
###出力:/ホーム/ラヴィ/ ..
私が知っている。このように簡単な方法がありますが、私はそれを見つけることができればとびきり...
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav
私はこれが古い質問であることを知っていますが、ここに情報を追加するだけです:
Linuxコマンドwhich
を使用して、コマンドファイルのファイルパスを見つけることができます。
$ which ls
/bin/ls
これにはいくつかの注意点があります。https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/を参照してください。
Mac、Linux、* nixで動作します:
これにより、現在のディレクトリにあるすべてのファイルの引用されたcsvが得られます。
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
この出力は、Pythonリストまたは同様のデータ構造に簡単にコピーできます。
fpn(完全パス名)スクリプトを使用できます。
% pwd
/Users/adamatan/bins/scripts/fpn
% ls
LICENSE README.md fpn.py
% fpn *
/Users/adamatan/bins/scripts/fpn/LICENSE
/Users/adamatan/bins/scripts/fpn/README.md
/Users/adamatan/bins/scripts/fpn/fpn.py
fpn
は標準のLinuxパッケージではありませんが、無料でオープンなgithubプロジェクトであり、すぐにセットアップできます。
pwd
、それ自体は、Linuxおよび他のほとんどのUnixライクなOS環境で正常に動作するはずです。
この関数を使用できます。ファイル名が相対パスなしで指定されている場合、現在の作業ディレクトリに存在すると見なされます。
abspath() { old=`pwd`;new=$(dirname "$1");if [ "$new" != "." ]; then cd $new; fi;file=`pwd`/$(basename "$1");cd $old;echo $file; }
使用法:
$ abspath file.txt
/I/am/in/present/dir/file.txt
相対パスでの使用:
$ abspath ../../some/dir/some-file.txt
/I/am/in/some/dir/some-file.txt
ファイル名にスペースを含む:
$ abspath "../../some/dir/another file.txt"
/I/am/in/some/dir/another file.txt
同様のシナリオで、他の場所からcshellスクリプトを起動しています。指定されたディレクトリでのみ実行されるようにスクリプトの正しい絶対パスを設定するために、次のコードを使用しています。
set script_dir = `pwd`/`dirname $0`
$0
スクリプトが実行された正確な文字列を格納します。
スクリプトは次のように起動された場合の例を示します$> ../../test/test.csh
、
$script_dir
含まれています/home/abc/sandbox/v1/../../test
./test.csh
場合、パスが次のようになります/test/.
Mac OS Xの場合、オペレーティングシステムに付属のユーティリティを置き換え、新しいバージョンのcoreutilsに置き換えました。これにより、readlink -f
(ファイルへの絶対パスの)およびrealpath
、Macの((ディレクトリへの絶対パス。
Homebrewバージョンでは、コマンド名の前に「G」(GNUツールの場合)が追加されます。したがって、同等のものはgreadlink -f FILE
およびになりgrealpath DIRECTORY
ます。
Corebutils / GNUツールをHomebrew経由でMac OS Xにインストールする方法の説明は、このStackExchangeアークティクルにあります。
注:Mac以外のUnixユーザーの場合readlink -f
、およびrealpath
コマンドはそのまま使用できます。
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
これは@ZeRemzの答えで何が起こっているかの説明です:
"$1"
dirname "$1"
cd "$(dirname "$1")
、この相対ディレクトリに入ります&& pwd -P
その絶対パスを取得します。-P
オプションはすべてのシンボリックリンクを回避します$(basename "$1")
echo
にこれはかなりうまくいきました。ファイルシステム(必要に応じて賛否両論)に依存しないため、高速になります。そして、それはほとんどすべての* NIXに移植可能であるべきです。渡された文字列が実際にはPWDに関連しており、他のディレクトリには関連していないと想定しています。
function abspath () {
echo $1 | awk '\
# Root parent directory refs to the PWD for replacement below
/^\.\.\// { sub("^", "./") } \
# Replace the symbolic PWD refs with the absolute PWD \
/^\.\// { sub("^\.", ENVIRON["PWD"])} \
# Print absolute paths \
/^\// {print} \'
}
これは素朴ですが、POSIXに準拠させる必要がありました。ファイルのディレクトリにcdする権限が必要です。
#!/bin/sh
if [ ${#} = 0 ]; then
echo "Error: 0 args. need 1" >&2
exit 1
fi
if [ -d ${1} ]; then
# Directory
base=$( cd ${1}; echo ${PWD##*/} )
dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; then
parentPath=${dir}
else
parentPath=${dir%/}
fi
if [ -z ${base} ] || [ -z ${parentPath} ]; then
if [ -n ${1} ]; then
fullPath=$( cd ${1}; echo ${PWD} )
else
echo "Error: unsupported scenario 1" >&2
exit 1
fi
fi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then
# File in current directory
base=$( echo ${1##*/} )
parentPath=$( echo ${PWD} )
else
echo "Error: unsupported scenario 2" >&2
exit 1
fi
elif [ -f ${1} ] && [ -d ${1%/*} ]; then
# File in directory
base=$( echo ${1##*/} )
parentPath=$( cd ${1%/*}; echo ${PWD} )
else
echo "Error: not file or directory" >&2
exit 1
fi
if [ ${parentPath} = / ]; then
fullPath=${fullPath:-${parentPath}${base}}
fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; then
echo "Error: does not exist" >&2
exit 1
fi
echo ${fullPath}
私のような、以下のシンボリックリンクと相対参照を含め、すでに与えられた回答の多くが、私は、ファイルのフルパスを取得するために、特にスクリプト内で、これは本当に重宝しているように.
し、..
dirname `readlink -e relative/path/to/file`
file
ルートパス以降のフルパスを返します。これをスクリプトで使用して、スクリプトが実行元のパスを認識できるようにすることができます。これは、マシンの任意の場所にあるリポジトリクローンで役立ちます。
basePath=`dirname \`readlink -e $0\``
その後${basePath}
、スクリプト内の変数を使用して、他のスクリプトを直接参照できます。
お役に立てれば、
デイブ
あなたはこれをあなたの中に保存するshell.rc
か、コンソールに置くことができます
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
例:
ap somefile.txt
出力されます
/home/user/somefile.txt
ap ../foobar.txt
が与えられますが/home/user/../foobar.txt
、これは一般的には望んでいないことです。
ap /tmp/foobar.txt
与えるでしょう/home/user//tmp/foobar.txt
、これは間違っています。
find / -samefile file.txt -print
file.txt と同じiノード番号を持つファイルへのすべてのリンクを検索します
-xdev
フラグを追加すると、find
デバイスの境界(「マウントポイント」)を越えることが回避されます。(ただし、がfind
同じデバイス上のディレクトリで開始しない場合、これはおそらく何も見つかりませんfile.txt
)
find
Inodeは複数のディレクトリエントリによってリンクされている可能性があるため、1つのファイルシステムオブジェクトの複数のパスを報告できることに注意してください。例えば:
find /bin -samefile /bin/gunzip -ls
出力されます:
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/uncompress
12845178 4 -rwxr-xr-x 2 root root 2251 feb 9 2012 /bin/gunzip
これはLinuxとMac OSXの両方で動作します。
echo $(pwd)$/$(ls file.txt)
Mac OSの場合、ファインダーでファイルのパスを取得するだけの場合は、ファイルをコントロールクリックし、下部にある[サービス]までスクロールします。「パスのコピー」や「フルパスのコピー」など、多くの選択肢があります。これらの1つをクリックすると、パスがクリップボードに配置されます。
Mac OSXでは、次の手順を実行します。
cd
ターゲットファイルのディレクトリに。ls "`pwd`/file.txt"
echo $(pwd)/file.txt
file.txt
実際のファイル名にます。"readlink -f"のほかに、よく使用される別のコマンド:
$find /the/long/path/but/I/can/use/TAB/to/auto/it/to/ -name myfile /the/long/path/but/I/can/use/TAB/to/auto/it/to/myfile $
これにより、コンソールでの絶対パスとファイル名も表示されます
オフトピック:この方法は、絶対ではなく、相対リンクを提供します。readlink -f
コマンドが正しいものです。