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

有没有一种简单的方法可以打印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
1506897 次浏览

使用阅读链接

readlink -f file.txt

我有一个更简单的方法,但该死的,如果我能找到它…

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

以下方法通常有效:

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

除了“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命令是正确的。

在类似的场景中,我从其他位置启动一个cshell脚本。为了设置脚本的正确绝对路径,使其仅在指定的目录中运行,我使用以下代码:

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

$0存储脚本执行方式的确切字符串。

例如,如果脚本是这样启动的:$> ../../test/test.csh$script_dir包含/home/abc/sandbox/v1/../../test

您可以将其保存在shell.rc中,或者只是放在控制台中

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

例子:

ap somefile.txt

将输出

/home/user/somefile.txt
find $PWD -type f | grep "filename"

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

这将为您提供文件的绝对路径:

find / -name file.txt

您可以使用fpn(完整路径名)脚本:

% pwd/Users/adamatan/bins/scripts/fpn
% lsLICENSE   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项目,你是可以在一分钟内安装好

find / -samefile file.txt -print

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

添加-xdev标志将避免find跨越设备边界(“挂载点”)。(但如果find不是从与file.txt相同设备上的目录开始,这可能会导致找不到任何东西)

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

find /bin -samefile /bin/gunzip -ls

将输出:

12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/uncompress12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/gunzip

我想你正在使用Linux。

我在coreutils 8.15中找到了一个名为realpath的实用程序。

realpath -s file.txt/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

由于问题是关于如何获取文件的完整/绝对路径而不是如何获得符号链接的目标,因此使用-s--no-symlinks,这意味着不要展开符号链接。

根据@泡沫聚苯乙烯-fling和@arch-stanton的评论,单独realpath不检查文件是否存在,要解决这个问题,请添加e参数:realpath -e file

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

将文本复制到剪贴板并在终端窗口上显示文本。

:)

(我从另一个堆栈溢出答案中复制了一些代码,但再也找不到那个答案了)

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

ls "`pwd`/file.txt"

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

对于Mac OS X,我替换了操作系统附带的实用程序,并将它们替换为更新版本的coreutils。这允许您在Mac上访问readlink -f(文件的绝对路径)和realpath(目录的绝对路径)等工具。

Homebrew版本在命令名前面附加了一个“G”(用于GNU Tools)——因此等价物变成了greadlink -f FILEgrealpath DIRECTORY

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

注意:readlink -frealpath命令应该为非Mac Unix用户开箱即用。

我找到的最简单的方法是:

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

它对我很有效。

这将适用于文件和文件夹:

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

通常:

find `pwd` | grep <filename>

或者,仅针对当前文件夹:

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

我喜欢已经给出的许多答案,但我发现这非常有用,特别是在脚本中获取文件的完整路径,包括以下符号链接和相对引用,例如...

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

这将从根路径开始返回file的完整路径。这可以在脚本中使用,以便脚本知道它从哪个路径运行,这在可以位于机器上任何位置的存储库克隆中很有用。

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

然后,我可以使用脚本中的${basePath}变量直接引用其他脚本。

希望这能有所帮助,

戴夫

创建如下函数(使用pwd回显文件的绝对路径并在路径末尾添加文件:

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

现在您可以找到任何文件路径:

abspath myfile.ext

在Mac OSX中,执行以下步骤:

  1. cd进入目标文件的目录。
  2. 键入以下任一终端命令。
终端
ls "`pwd`/file.txt"echo $(pwd)/file.txt
  1. file.txt替换为您的实际文件名。
  2. 输入

这适用于Linux和Mac OSX:

echo $(pwd)$/$(ls file.txt)

另一个Linux实用程序,完成这项工作:

fname <file>
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

这是对@ZeRemz回答发生的事情的解释:

  1. 此脚本获取相对路径作为参数"$1"
  2. 然后我们得到该路径的迪尔名称部分(您可以将dir或文件传递给此脚本):dirname "$1"
  3. 然后我们cd "$(dirname "$1")进入这个相对目录
  4. && pwd -P并获取它的绝对路径。-P选项将避免所有符号链接
  5. 之后我们将basename附加到绝对路径:$(basename "$1")
  6. 作为最后一步,我们echo

我知道这是一个老问题,但只是为了补充这里的信息:

Linux命令which可用于查找命令文件的文件路径,即。

$ which ls/bin/ls

对此有一些警告;请参阅https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/

对于Mac OS,如果您只想在查找器中获取文件的路径,请单击该文件,然后向下滚动到底部的“服务”。您可以获得许多选择,包括“复制路径”和“复制完整路径”。单击其中一个将路径放在剪贴板上。

适用于Mac,Linux,*nix:

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

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

这个输出可以很容易地复制到python列表或任何类似的数据结构中。

在Windows上:

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

关于Linux:

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

这对我来说工作得很好。它不依赖于文件系统(根据需要是pro/con),所以它会很快;而且,它应该可以移植到大多数*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)打开终端在包含您文件的文件夹中,按键盘上的以下键:

CTRL+ALT+T

2)然后键入“pwd”(WorkingDirectory的Print名称的首字母缩写):

your@device ~ $ pwd

这是所有的人!

您可以使用此功能。如果给出的文件名没有相对路径,则假定它存在于当前工作目录中:

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

这是幼稚的,但我必须使它符合POSIX。需要权限以cd进入文件的目录。

#!/bin/shif [ ${#} = 0 ]; thenecho "Error: 0 args. need 1" >&2exit 1fi

if [ -d ${1} ]; then

# Directory

base=$( cd ${1}; echo ${PWD##*/} )dir=$( cd ${1}; echo ${PWD%${base}} )
if [ ${dir} = / ]; thenparentPath=${dir}elseparentPath=${dir%/}fi
if [ -z ${base} ] || [ -z ${parentPath} ]; thenif [ -n ${1} ]; thenfullPath=$( cd ${1}; echo ${PWD} )elseecho "Error: unsupported scenario 1" >&2exit 1fifi
elif [ ${1%/*} = ${1} ]; then
if [ -f ./${1} ]; then

# File in current directory
base=$( echo ${1##*/} )parentPath=$( echo ${PWD} )
elseecho "Error: unsupported scenario 2" >&2exit 1fielif [ -f ${1} ] && [ -d ${1%/*} ]; then

# File in directory
base=$( echo ${1##*/} )parentPath=$( cd ${1%/*}; echo ${PWD} )
elseecho "Error: not file or directory" >&2exit 1fi
if [ ${parentPath} = / ]; thenfullPath=${fullPath:-${parentPath}${base}}fi
fullPath=${fullPath:-${parentPath}/${base}}
if [ ! -e ${fullPath} ]; thenecho "Error: does not exist" >&2exit 1fi
echo ${fullPath}

在mac中,下面提到的行可以工作。不需要添加任何花哨的线条。

> pwd filename

在Linux或Mac上获取文件完整路径的最短方法是使用ls命令和PWD环境变量。

<0.o> touch afile<0.o> pwd/adir<0.o> ls $PWD/afile/adir/afile

您可以对自己的目录变量执行相同的操作,例如d

<0.o> touch afile<0.o> d=/adir<0.o> ls $d/afile/adir/afile

请注意,没有标志ls <FILE>echo <FILE>是等效的(对于当前目录中的有效文件名),因此如果您为此使用echo,如果您愿意,可以使用ls代替。

如果情况相反,因此您拥有完整路径并想要文件名,只需使用basename命令。

<0.o> touch afile<0.o> basename $PWD/afileafile

我很惊讶没有人提到定位。

如果您安装了locate包,您甚至不需要在目录中包含感兴趣的文件。

假设我正在寻找setenv.sh脚本的完整路径名。这是如何找到它。

$ locate setenv.sh/home/davis/progs/devpost_aws_disaster_response/python/setenv.sh/home/davis/progs/devpost_aws_disaster_response/webapp/setenv.sh/home/davis/progs/eb_testy/setenv.sh

注意,在这种情况下,它会找到三个脚本,但如果我只想要一个,我就会找到一个。会这样做:

$ locate *testy*setenv.sh/home/davis/progs/eb_testy/setenv.sh

这可以简化

 ls <file_name> | pwd
you@you:~/test$ lsfileyou@you:~/test$ path="`pwd`/`ls`"you@you:~/test$ echo $path/home/you/test/file