Answers:
使用readlink:
readlink -f file.txt
brew install coreutils
再greadlink -f file.txt
我想您正在使用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
realpath
致力于2011年底的coreutils回购,版本8.15于2012年1月完成,我readlink
于2011年3月回答了这个问题(并提出了建议):)
realpath -e
如果参数不存在,则@styrofoamfly 将显示错误。
以下通常可以解决问题:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
LOCAL_VARIABLE="filename.txt" && echo $(cd $(dirname "$LOCAL_VARIABLE") && pwd -P)/$(basename "$LOCAL_VARIABLE")
readlink
如果该文件是符号链接不起作用,它将向您显示符号链接的目标,而不是符号链接本身。
readlink
将我带回到符号链接生成的父目录,但是它忽略了它。
set .. && echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
###输出:/ home / ravi / ..
我知道有一种更简单的方法,但是我发现我很胆怯...
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
find $PWD -type f | grep "filename"
要么
find $PWD -type f -name "*filename*"
find `pwd` -type file -name \*.dmp
我知道这是一个古老的问题,但仅在此处添加信息:
Linux命令which
可用于查找命令文件的文件路径,即
$ which ls
/bin/ls
有一些注意事项;请参阅https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/。
适用于Mac,Linux和* nix:
这将为您提供当前目录中所有文件的带引号的csv:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
这样的输出可以轻松地复制到python列表或任何类似的数据结构中。
您可以使用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项目,您可以在一分钟内完成设置。
pwd
就其本身而言,它应该可以在Linux和大多数其他类似Unix的OS环境上正常运行。
您可以使用此功能。如果给出的文件名没有相对路径,则假定它存在于当前工作目录中:
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
对于Mac OS X,我替换了操作系统附带的实用程序,并用较新版本的coreutils替换了它们。这样,您就可以访问Mac上的工具readlink -f
((用于指向文件的绝对路径)和realpath
(用于目录的绝对路径)。
Homebrew版本在命令名称前面附加了“ G”(对于GNU Tools)-因此等效项变为greadlink -f FILE
and grealpath DIRECTORY
。
可以在此StackExchange arcticle中找到有关如何通过Homebrew在Mac OS X上安装coreutils / GNU工具的说明。
注意:对于非Mac Unix用户,readlink -f
和realpath
命令应开箱即用。
brew install coreutils
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
"$1"
dirname "$1"
cd "$(dirname "$1")
进入这个相对目录&& pwd -P
并为其获取绝对路径。-P
该选项将避免所有符号链接$(basename "$1")
echo
就这对我来说效果很好。它不依赖于文件系统(取决于需要的优点/缺点),因此它很快。并且,它应该可以移植到大多数* 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}
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
这适用于Linux和Mac OSX ..
echo $(pwd)$/$(ls file.txt)
创建如下所示的函数(用pwd回显文件的绝对路径,并将该文件添加到路径的末尾:
abspath() { echo $(pwd "$1")/"$1"; }
现在,您可以找到任何文件路径:
abspath myfile.ext