ChatGPT解决这个技术问题 Extra ChatGPT

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

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

C
Cristian Ciupitu

使用 readlink

readlink -f file.txt

刚刚在 10.9.2 上测试,工作正常。其中 readlink /usr/local/opt/coreutils/libexec/gnubin/readlink readlink --version readlink (GNU coreutils) 8.22
@J0hnG4lt:那是因为您使用自制软件安装了 coreutils 并更改了 PATH 以指向无前缀的二进制文件。安装 coreutils,不理会 PATH 并使用“greadlink”也可以。
在 MAC 上:安装自制软件然后 brew install coreutils 然后 greadlink -f file.txt
来自 readlink 的手册页:注意 realpath 是用于规范化功能的首选命令。
M
M Imam Pratama

我想你正在使用Linux。

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

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

由于问题是关于如何获取文件的完整/绝对路径而不是关于 how to get the target of symlinks,请使用 -s--no-symlinks,这意味着不要扩展符号链接。

根据 @styrofoam-fly 和 @arch-standton 评论,单独的 realpath 不会检查文件是否存在,要解决此问题,请添加 e 参数:realpath -e file


realpath 致力于 2011 年底的 coreutils 回购,2012 年 1 月完成了 8.15 版,我在 2011 年 3 月回答了这个问题(带有 readlink 建议):)
realpath 不检查文件是否存在,它只是解析路径。询问不存在文件的完整路径应该会导致错误。
如果参数不存在,@styrofoamfly realpath -e 会打印错误。
这比 readlink 更好,因为您可以获得文件和文件夹的完整路径!
添加 -s 选项以不扩展符号链接。
Z
ZeRemz

以下通常可以解决问题:

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

你好。我发现这个答案最符合我的要求。你能解释一下如何使用局部变量而不是命令行参数(即 $1)
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
@SopalajodeArrierez 因为如果文件是符号链接 readlink 不起作用,它会显示符号链接的目标而不是符号链接本身。
我喜欢这个,因为 readlink 将我带回到生成符号链接的父目录,但这忽略了它。
我认为这应该是公认的答案,因为它具有可移植性。
G
GreenGiant

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

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

K
Kate Orlova

在 Windows 上:

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

在 Linux 上:

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


r
rogerdpack
find $PWD -type f | grep "filename"

或者

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

对我来说,在 mac 上,这有效 - 而不是 $pwd - find `pwd` -type file -name \*.dmp
谢谢!这启发了我使用更简单的 find $PWD,当它只有几个文件时它非常适合我
S
Steven

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

ls "`pwd`/file.txt"

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


你也可以做echo $(pwd)/file.txt
L
Lord Cat

我知道这是一个老问题,但只是在这里添加信息:

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

$ which ls
/bin/ls

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


这个答案太具体了,OP 不是关于查找命令的。
A
Adam Matan

您可以使用 fpn (full path name) 脚本:

% 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 软件包,但它是 a free and open github project 和您 could set it up in a minute


通常,pwd 本身应该可以在 Linux 和大多数其他类 Unix 操作系统环境中正常运行。
B
Bhargav Srinivasan

适用于 Mac、Linux、*nix:

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

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

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


打印当前密码路径
是的,pwd 中所有文件的完整路径用逗号分隔,对于文件只需执行 ls 'filename' 而不是 'ls'。
R
Ramu

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

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

C
Chris Tang

您可以将其保存在您的 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,这是错误的。
A
Ackq

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

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

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

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


投票赞成这个,因为这是最简单和最相关的。但是,如果您键入 ./test.csh,您将有一个以 /test/. 结尾的路径
C
Community

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

Homebrew 版本在命令名称前附加了一个“G”(用于 GNU 工具)——因此等效项变为 greadlink -f FILEgrealpath DIRECTORY

this StackExchange arcticle 中提供了有关如何通过 Homebrew 在 Mac OS X 上安装 coreutils/GNU 工具的说明。

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


brew install coreutils
C
Community
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")

这是对 @ZeRemz 的 answer 上发生的事情的解释:

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


a
angstyloop

在 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/afile
afile

n
netskink

我很惊讶没有人提到找到。

如果您安装了 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

D
Dave Rix

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

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

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

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

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

希望这可以帮助,

戴夫


R
Russell Speight

这对我来说效果很好。它不依赖于文件系统(取决于需要的优点/缺点),所以它会很快;并且,它应该可以移植到大多数 *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} \'
}

A
Andrew Miller

这很天真,但我必须让它符合 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}

K
Karol Selak

这适用于 Linux 和 Mac OSX:

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

w
wildplasser
find / -samefile file.txt -print

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

添加 -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/uncompress
12845178    4 -rwxr-xr-x   2 root     root         2251 feb  9  2012 /bin/gunzip

s
sjas

通常:

find `pwd` | grep <filename>

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

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

J
Jahid

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

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

B
BluVio

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

fname <file>

R
Richard Sharpe

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


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

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

:)

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


r
raam86

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

cd 进入目标文件的目录。键入以下任一终端命令。

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

将 file.txt 替换为您的实际文件名。按回车


M
Mike Fielden

除了 "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 /它/到/我的文件 $

这也给出了控制台的完整路径和文件名

题外话:这个方法只给出相对链接,不是绝对的。 readlink -f 命令是正确的。


N
Nestor Urquiza

创建一个如下所示的函数(使用 pwd 回显文件的绝对路径并将文件添加到路径的末尾:

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

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

abspath myfile.ext