ファイルの完全なパスを取得するにはどうすればよいですか?


717

の完全なパスを印刷する簡単な方法はありfile.txtますか?

file.txt = /nfs/an/disks/jj/home/dir/file.txt

<command>

dir> <command> file.txt  

印刷する必要があります

/nfs/an/disks/jj/home/dir/file.txt

回答:


1188

readlinkを使用します

readlink -f file.txt

32
これが '-f'の目的です。
フィルマー、2011年


5
10.9.2でテストしただけで問題なく動作します。どのreadlink / usr / local / opt / coreutils / libexec / gnubin / readlink readlink --version readlink(GNU coreutils)8.22
J0hnG4lt 14

10
@ J0hnG4lt:これは、homebrewでcoreutilsをインストールし、接頭辞のないバイナリを指すようにPATHを変更したためです。coreutilsをインストールし、PATHをそのままにして、「greadlink」を使用することもできます。
ティム・スミス

35
MAC:自作をインストールしてbrew install coreutilsからgreadlink -f file.txt
Kra Kra

217

Linuxを使用していると思います。

realpathcoreutils 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


Cygwin(mintty 2.7.9を使用)で動作します
Scrambo '27

1
realpath2011年末にcoreutilsレポにコミットし、リリース8.15は2012年1月に行われ、readlink2011年3月に(提案とともに)質問に回答しました:)
フィルムまたは

2
realpathはファイルの存在をチェックせず、パスを解決するだけです。存在しないファイルの絶対パスを要求すると、エラーが発生するはずです。
発泡スチロールのフライ

4
@styrofoamfly realpath -eは、引数が存在しない場合にエラーを出力します。
アーチスタントン

76

通常は次の方法で対処できます。

 echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

こんにちは。私はこの答えが私の要件に最も適していると思いました。コマンドラインパラメーター(つまり$ 1)の代わりにローカル変数を使用する方法を説明できますか
deeJ

1
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
stiemannkj1

7
@SopalajodeArrierez readlinkファイルがシンボリックリンクの場合は機能しないため、シンボリックリンク自体ではなく、シンボリックリンクのターゲットが表示されます。
qwertzguy 2014年

1
私はこれが好きです、なぜなら readlinkシンボリックリンクの生成元の親ディレクトリに戻るはですが、無視されます。
2015年

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ###出力:/ホーム/ラヴィ/ ..
トム・ヘイル

35

私が知っている。このように簡単な方法がありますが、私はそれを見つけることができればとびきり...

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

26
find $PWD -type f | grep "filename"

または

find $PWD -type f -name "*filename*"

1
私にとって、Macでは、これは$ pwdの代わりに機能しましたfind `pwd` -type file -name \*.dmp
mrwaim

14

ファイルと同じディレクトリにいる場合:

ls "`pwd`/file.txt"

file.txt目的のファイル名に置き換えます。


9
あなたも行うことができますecho $(pwd)/file.txt
アレックス

12

Windowsの場合:

  • ホールディングShiftWindowsエクスプローラでファイルを右クリックしては、あなたと呼ばれるオプションを提供しますCopy as Path。これにより、ファイルの完全パスがクリップボードにコピーされます。

Linuxの場合:

  • このコマンドrealpath yourfileを使用して、他のユーザーが提案するようにファイルの完全パスを取得できます。

4

私はこれが古い質問であることを知っていますが、ここに情報を追加するだけです:

Linuxコマンドwhichを使用して、コマンドファイルのファイルパスを見つけることができます。

$ which ls
/bin/ls

これにはいくつかの注意点があります。https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/を参照してください


5
この答えは具体的すぎます。OPはコマンドを見つけることではありません。
AL

4

Mac、Linux、* nixで動作します:

これにより、現在のディレクトリにあるすべてのファイルの引用されたcsvが得られます。

ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'

この出力は、Pythonリストまたは同様のデータ構造に簡単にコピーできます。


現在の
パスワード

はい、pwd内のすべてのファイルのカンマ区切りのフルパス。ファイルの場合は、単に「ls」ではなくls 'filename'を実行します。
Bhargav Srinivasan

3

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プロジェクトであり、すぐにセットアップできます。


1
一般にpwd、それ自体は、Linuxおよび他のほとんどのUnixライクなOS環境で正常に動作するはずです。
karolus

3

この関数を使用できます。ファイル名が相対パスなしで指定されている場合、現在の作業ディレクトリに存在すると見なされます。

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

2

同様のシナリオで、他の場所からcshellスクリプトを起動しています。指定されたディレクトリでのみ実行されるようにスクリプトの正しい絶対パスを設定するために、次のコードを使用しています。

set script_dir = `pwd`/`dirname $0`

$0 スクリプトが実行された正確な文字列を格納します。

スクリプトは次のように起動された場合の例を示します$> ../../test/test.csh$script_dir含まれています/home/abc/sandbox/v1/../../test


これが最も簡単で最も関連性があるため、これに投票しました。ただし、入力した./test.csh場合、パスが次のようになります/test/.
Vinyll

2

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コマンドはそのまま使用できます。


2
brew install coreutils
Kraへ

2
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

これは@ZeRemzの答えで何が起こっているかの説明です:

  1. このスクリプトは、引数として相対パスを取得します "$1"
  2. 次に、そのパスのdirname部分を取得します(dirまたはfileをこのスクリプトに渡すことができます)。dirname "$1"
  3. 次にcd "$(dirname "$1")、この相対ディレクトリに入ります
  4. && pwd -Pその絶対パスを取得します。-Pオプションはすべてのシンボリックリンクを回避します
  5. その後、絶対パスにベース名を追加します。$(basename "$1")
  6. 最後のステップは、私たちのようecho

1

これはかなりうまくいきました。ファイルシステム(必要に応じて賛否両論)に依存しないため、高速になります。そして、それはほとんどすべての* 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} \'
}

1

これは素朴ですが、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}

0

通常:

find `pwd` | grep <filename>

または、現在のフォルダーのみ:

find `pwd` -maxdepth 1 | grep <filename>

なんで嫌いなの?
2018年

0

私のような、以下のシンボリックリンクと相対参照を含め、すでに与えられた回答の多くが、私は、ファイルのフルパスを取得するために、特にスクリプト内で、これは本当に重宝しているように.し、..

dirname `readlink -e relative/path/to/file`

fileルートパス以降のフルパスを返します。これをスクリプトで使用して、スクリプトが実行元のパスを認識できるようにすることができます。これは、マシンの任意の場所にあるリポジトリクローンで役立ちます。

basePath=`dirname \`readlink -e $0\``

その後${basePath}、スクリプト内の変数を使用して、他のスクリプトを直接参照できます。

お役に立てれば、

デイブ


0

あなたはこれをあなたの中に保存するshell.rcか、コンソールに置くことができます

function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"

例:

ap somefile.txt

出力されます

/home/user/somefile.txt

3
しかし、それからap ../foobar.txtが与えられますが/home/user/../foobar.txt、これは一般的には望んでいないことです。
bdesham 2013

2
ap /tmp/foobar.txt与えるでしょう/home/user//tmp/foobar.txt、これは間違っています。
Davidが

-1
find / -samefile file.txt -print

file.txt と同じiノード番号を持つファイルへのすべてのリンクを検索します

-xdevフラグを追加すると、findデバイスの境界(「マウントポイント」)を越えることが回避されます。(ただし、がfind同じデバイス上のディレクトリで開始しない場合、これはおそらく何も見つかりませんfile.txt

findInodeは複数のディレクトリエントリによってリンクされている可能性があるため、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

-1

これはファイルとフォルダの両方で機能します:

getAbsolutePath(){
    [[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } || 
    { cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}


-1

この仕事をする別のLinuxユーティリティ:

fname <file>

-1

Mac OSの場合、ファインダーでファイルのパスを取得するだけの場合は、ファイルをコントロールクリックし、下部にある[サービス]までスクロールします。「パスのコピー」や「フルパスのコピー」など、多くの選択肢があります。これらの1つをクリックすると、パスがクリップボードに配置されます。


-1

下記のMacでは行が機能します。派手な線を追加する必要はありません。

> pwd filename

6
いいえ、コマンドの名前が示すように、作業ディレクトリ(ファイル名なし)を出力するだけですprint working directory
anilbey

-2
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}

テキストをクリップボードにコピーし、ターミナルウィンドウにテキストを表示します。

:)

(別のスタックオーバーフローの回答からコードの一部をコピーしましたが、その回答はもう見つかりません)


-2

私が見つけた最も簡単な方法は

for i in `ls`; do echo "`pwd`/$i"; done

それは私にとってうまくいきます


-2

Mac OSXでは、次の手順を実行します。

  1. cd ターゲットファイルのディレクトリに。
  2. 次の端末コマンドのいずれかを入力します。
ターミナル
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
  1. 交換する file.txt実際のファイル名にます。
  2. 押す Enter

-3

"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コマンドが正しいものです。


-3

以下のような関数を作成します(pwdでファイルの絶対パスをエコーし​​、パスの最後にファイルを追加します:

abspath() { echo $(pwd "$1")/"$1"; }

これで、任意のファイルパスを見つけることができます。

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