如何获取文件的完整路径?


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

Answers:


1187

使用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 2014年

10
@ J0hnG4lt:这是因为您使用自制软件安装了coreutils,并更改了PATH以指向未前缀的二进制文件。安装coreutils,不理会PATH,并使用“ greadlink”也可以。
蒂姆·史密斯

35
在MAC:安装自制软件,然后brew install coreutilsgreadlink -f file.txt
以克拉

217

我想您正在使用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


与cygwin一起使用(含薄荷2.7.9)
Scrambo

1
realpath致力于2011年底的coreutils回购,版本8.15于2012年1月完成,我readlink于2011年3月回答了这个问题(并提出了建议):)
电影制片人

2
realpath不会检查文件是否存在,它只是解析路径。要求不存在的文件的完整路径会导致错误。
发泡胶飞

4
realpath -e如果参数不存在,则@styrofoamfly 将显示错误。
斯坦顿

76

以下通常可以解决问题:

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

你好。我发现这个答案最符合我的要求。你能解释我如何可以使用本地变量,而不是命令行参数(即$ 1)
迪吉

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

7
@SopalajodeArrierez因为readlink如果该文件是符号链接不起作用,它将向您显示符号链接的目标,而不是符号链接本身。
qwertzguy 2014年

1
我喜欢这样,因为readlink将我带回到符号链接生成的父目录,但是它忽略了它。
苏基2015年

set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1") ###输出:/ home / ravi / ..
Tom Hale

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


14

如果与文件位于同一目录中:

ls "`pwd`/file.txt"

替换file.txt为目标文件名。


9
您也可以这样做echo $(pwd)/file.txt
Alex

12

在Windows上:

  • Shift在Windows资源管理器中按住并右键单击文件,可以得到一个名为的选项Copy as Path。这会将文件的完整路径复制到剪贴板。

在Linux上:

  • 您可以使用该命令realpath yourfile来获取其他人建议的文件的完整路径。


4

适用于Mac,Linux和* nix:

这将为您提供当前目录中所有文件的带引号的csv:

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

这样的输出可以轻松地复制到python列表或任何类似的数据结构中。


打印当前的pwd路径
Sand1512 '18

是的,用逗号分隔pwd中所有文件的完整路径,对于文件,只需执行ls“文件名”而不是“ ls”。
巴尔加夫·斯里尼瓦桑

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/.
–ylyl

2

对于Mac OS X,我替换了操作系统附带的实用程序,并用较新版本的coreutils替换了它们。这样,您就可以访问Mac上的工具readlink -f((用于指向文件的绝对路径)和realpath(用于目录的绝对路径)。

Homebrew版本在命令名称前面附加了“ G”(对于GNU Tools)-因此等效项变为greadlink -f FILEand grealpath DIRECTORY

可以在此StackExchange arcticle中找到有关如何通过Homebrew在Mac OS X上安装coreutils / GNU工具的说明。

注意:对于非Mac Unix用户,readlink -frealpath命令应开箱即用。


2
brew install coreutils
向Kra

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

这是@ZeRemz 答案解释

  1. 该脚本获取相对路径作为参数 "$1"
  2. 然后,我们获得该路径的目录名部分(您可以将目录或文件传递给此脚本):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>

嗯,为什么讨厌?
sjas,

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

2
ap /tmp/foobar.txt将给出/home/user//tmp/foobar.txt,这是错误的。
大卫

-1
find / -samefile file.txt -print

将找到具有与file.txt 相同的inode编号的文件的所有链接

添加-xdev标志将避免find越过设备边界(“安装点”)。(但是,如果find不能在与相同设备上的目录下开始,则可能会导致找不到任何内容file.txt

请注意,它find可以报​​告单个文件系统对象的多个路径,因为一个节点可以由多个目录条目链接,甚至可能使用不同的名称。例如:

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

在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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.