#!/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}
1
除了“readlink -f”之外,另一个常用命令:
$ find / the / long / path /但/ I / can / use / TAB / to / auto / it / to / -name myfile /中/长/路径/但/ I / CAN /使用/ TAB /到/自动/它/到/ MYFILE $
这也在控制台上提供完整的路径和文件名
偏离主题:此方法只提供相对链接,而不是绝对链接 . readlink -f 命令是正确的 .
-1
*Works on Mac, Linux, nix:
这将为您提供当前目录中所有文件的引用csv:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
30 回答
对于Mac OS,如果您只想在取景器中获取文件的路径,请控制单击该文件,然后向下滚动到底部的“服务” . 你有很多选择,包括“复制路径”和“复制完整路径” . 单击其中一个将路径放在剪贴板 .
使用readlink:
以下通常可以解决问题:
另一个Linux工具,它完成这项工作:
这适用于文件和文件夹:
你可以使用fpn (full path name)脚本:
fpn
不是标准的Linux软件包,但它是a free and open github project而你could set it up in a minute .我知道现在这是一个老问题,但只是在这里添加信息:
Linux命令
which
可用于查找命令文件的文件路径,即这有一些警告;请看https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/ .
这很天真,但我不得不让它符合POSIX标准 . 需要cd进入文件目录的权限 .
除了“readlink -f”之外,另一个常用命令:
这也在控制台上提供完整的路径和文件名
偏离主题:此方法只提供相对链接,而不是绝对链接 .
readlink -f
命令是正确的 .*Works on Mac, Linux, nix:
这将为您提供当前目录中所有文件的引用csv:
这个输出可以很容易地复制到python列表或任何类似的数据结构中 .
我想你正在使用Linux .
我在coreutils 8.15中找到了一个名为
realpath
的实用程序 .根据@ styrofoam-fly和@ arch-standton的评论,
realpath
单独不检查文件是否存在,解决此问题添加e
参数:realpath -e file
这是对@ ZeRemz的answer内容的解释:
此脚本获取相对路径作为参数
"$1"
然后我们得到该路径的dirname部分(您可以将dir或文件传递给此脚本):
dirname "$1"
然后我们
cd "$(dirname "$1")
进入这个相对的目录&& pwd -P
并获得它的绝对路径 .-P
选项将避免所有符号链接之后我们将basename附加到绝对路径:
$(basename "$1")
作为最后一步我们
echo
它我找到的最简单的方法是
这对我来说很有效
创建一个如下所示的函数(用pwd回显文件的绝对路径,并在路径的末尾添加文件:
现在您可以找到任何文件路径:
我知道这有一个更简单的方法,但是如果我能找到它就会变得很难...
这对我很有用 . 它不依赖于文件系统(根据需要的pro / con),所以它会很快;并且,它应该可移植到大多数* NIX . 它确实假设传递的字符串确实是相对于PWD而不是其他目录 .
在Mac OSX中,执行以下步骤:
cd
进入目标文件的目录 .键入以下任一终端命令 .
终端
将
file.txt
替换为您的实际文件名 .按Enter键
在Windows中你可以: -
按住shift并右键单击一个文件,该文件为您提供了“Copy as Path”选项
这会将文件的完整路径复制到剪贴板 .
在Linux中,您可以使用以下命令: -
realpath yourfile
获取许多人建议的文件的完整路径 .我喜欢已经给出的许多答案,但我发现这非常有用,特别是在脚本中获取文件的完整路径,包括以下符号链接和相关引用,如
.
和..
这将从根路径返回
file
的完整路径 . 这可以在脚本中使用,以便脚本知道它从哪个路径运行,这在可以位于计算机上任何位置的存储库克隆中很有用 .然后,我可以在脚本中使用
${basePath}
变量来直接引用其他脚本 .希望这可以帮助,
戴夫
要么
对于Mac OS X,我替换了操作系统附带的实用程序,并将其替换为较新版本的coreutils . 这允许您访问Mac上的
readlink -f
(用于文件的绝对路径)和realpath
(目录的绝对路径)等工具 .Homebrew版本在命令名称前附加了'G'(对于GNU工具) - 因此等价物变为
greadlink -f FILE
和grealpath DIRECTORY
.有关如何通过Homebrew在Mac OS X上安装coreutils / GNU Tools的说明,请参见this StackExchange arcticle .
注意:对于非Mac Unix用户,
readlink -f
和realpath
命令应该是开箱即用的 .将使用与file.txt相同的 inode number 找到该文件的所有链接
添加
-xdev
标志将避免find
跨越设备边界("mount points") . (但如果find
没有在与file.txt
相同的设备上的目录中启动,则可能无法找到任何内容)请注意
find
可以报告单个文件系统对象的多个路径,因为Inode可以通过多个目录条目链接,甚至可能使用不同的名称 . 例如:将输出:
这适用于Linux和Mac OSX ..
通常:
或者,仅适用于当前文件夹:
要获取文件的完整路径:
1)打开你的终端 in the folder containing your file ,按下键盘上的键:
CTRL ALT T
2)然后键入"pwd"( P rint名称 W orking D irectory的首字母缩写):
这是所有人!
您可以将其保存在“shell.rc”中或仅放入控制台
例:
将输出
在类似的场景中,我正在从其他位置启动一个cshell脚本 . 要设置脚本的正确绝对路径以使其仅在指定目录中运行,我使用以下代码:
$0
存储脚本执行的确切字符串 .对于例如如果脚本是这样启动的:
$> ../../test/test.csh
,$script_dir
将包含/home/abc/sandbox/v1/../../test
您可以使用此功能 . 如果给出的文件名没有相对路径,则假定它出现在当前工作目录中:
用法:
使用相对路径:
文件名中包含空格:
将文本复制到剪贴板并在终端窗口中显示文本 .
:)
(我从另一个堆栈溢出答案中复制了一些代码,但找不到该答案了)
如果您与文件位于同一目录中:
用目标文件名替换
file.txt
.