我想你正在使用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 -e
会打印错误。
-s
选项以不扩展符号链接。
以下通常可以解决问题:
echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
不起作用,它会显示符号链接的目标而不是符号链接本身。
readlink
将我带回到生成符号链接的父目录,但这忽略了它。
我知道有一个更简单的方法,但如果我能找到它,我就该死......
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
在 Windows 上:
在 Windows 资源管理器中按住 Shift 并右键单击文件会为您提供一个名为“复制为路径”的选项。这会将文件的完整路径复制到剪贴板。
在 Linux 上:
您可以使用命令 realpath yourfile 来获取其他人建议的文件的完整路径。
find $PWD -type f | grep "filename"
或者
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
find $PWD
,当它只有几个文件时它非常适合我
如果您与文件位于同一目录中:
ls "`pwd`/file.txt"
将 file.txt
替换为您的目标文件名。
echo $(pwd)/file.txt
我知道这是一个老问题,但只是在这里添加信息:
Linux命令which
可用于查找命令文件的文件路径,即
$ which ls
/bin/ls
对此有一些警告;请参阅https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/。
您可以使用 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 操作系统环境中正常运行。
适用于 Mac、Linux、*nix:
这将为您提供当前目录中所有文件的引用 csv:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
它的输出可以很容易地复制到 python 列表或任何类似的数据结构中。
您可以使用此功能。如果给出的文件名没有相对路径,则假定它存在于当前工作目录中:
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
您可以将其保存在您的 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
,这是错误的。
在类似的场景中,我正在从其他位置启动一个 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 替换了它们。这允许您在 Mac 上访问诸如 readlink -f
(文件的绝对路径)和 realpath
(目录的绝对路径)之类的工具。
Homebrew 版本在命令名称前附加了一个“G”(用于 GNU 工具)——因此等效项变为 greadlink -f FILE
和 grealpath DIRECTORY
。
this StackExchange arcticle 中提供了有关如何通过 Homebrew 在 Mac OS X 上安装 coreutils/GNU 工具的说明。
注意:对于非 Mac Unix 用户,readlink -f
和 realpath
命令应该开箱即用。
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
这是对 @ZeRemz 的 answer 上发生的事情的解释:
该脚本获取相对路径作为参数 "$1" 然后我们获取该路径的 dirname 部分(您可以将 dir 或文件传递给此脚本): dirname "$1" 然后我们 cd "$(dirname "$1") 进入这个相对目录&& pwd -P 并获取它的绝对路径。-P 选项将避免所有符号链接之后,我们将 basename 附加到绝对路径: $(basename "$1") 作为最后一步,我们回显它
在 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
我很惊讶没有人提到找到。
如果您安装了 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
我喜欢已经给出的许多答案,但我发现这非常有用,尤其是在获取文件完整路径的脚本中,包括以下符号链接和相对引用,例如 .
和 ..
dirname `readlink -e relative/path/to/file`
这将返回从根路径开始的 file
的完整路径。这可以在脚本中使用,以便脚本知道它从哪个路径运行,这在可以位于机器上任何位置的存储库克隆中很有用。
basePath=`dirname \`readlink -e $0\``
然后我可以在我的脚本中使用 ${basePath}
变量来直接引用其他脚本。
希望这可以帮助,
戴夫
这对我来说效果很好。它不依赖于文件系统(取决于需要的优点/缺点),所以它会很快;并且,它应该可以移植到大多数 *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}
这适用于 Linux 和 Mac OSX:
echo $(pwd)$/$(ls file.txt)
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
通常:
find `pwd` | grep <filename>
或者,仅针对当前文件夹:
find `pwd` -maxdepth 1 | grep <filename>
这将适用于文件和文件夹:
getAbsolutePath(){
[[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } ||
{ cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
另一个 Linux 实用程序,可以完成这项工作:
fname <file>
对于 Mac OS,如果您只想在查找器中获取文件的路径,请控制单击该文件,然后向下滚动到底部的“服务”。您有很多选择,包括“复制路径”和“复制完整路径”。单击其中之一会将路径放在剪贴板上。
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}
将文本复制到剪贴板并在终端窗口上显示文本。
:)
(我从另一个堆栈溢出答案中复制了一些代码,但再也找不到该答案了)
在 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 /它/到/我的文件 $
这也给出了控制台的完整路径和文件名
题外话:这个方法只给出相对链接,不是绝对的。 readlink -f
命令是正确的。
创建一个如下所示的函数(使用 pwd 回显文件的绝对路径并将文件添加到路径的末尾:
abspath() { echo $(pwd "$1")/"$1"; }
现在您可以找到任何文件路径:
abspath myfile.ext
brew install coreutils
然后greadlink -f file.txt
readlink
的手册页:注意realpath
是用于规范化功能的首选命令。