问题:是否有一个简单的sh/bash/zsh/fish/…命令打印我输入的任何文件的绝对路径?
使用案例:我在/a/b目录中,我想打印命令行上文件c的完整路径,这样我就可以轻松地将其粘贴到另一个程序:/a/b/c中。简单,但一个小程序来做这可能会节省我5秒左右,当涉及到处理长路径时,这最终会增加。所以我很惊讶我找不到一个标准的实用程序来做这个-真的没有吗?
下面是一个示例实现abspath.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/usr/bin/python
# Author: Diggory Hardy <[email protected]>
# Licence: public domain
# Purpose: print the absolute path of all input paths
import sys
import os.path
if len (sys.argv )>1:
for i in range (1,len (sys.argv )):
print os.path.abspath ( sys.argv [i ] )
sys.exit (0)
else:
print >> sys.stderr, "Usage:",sys.argv [0], " PATH."
sys.exit (1) |
- 我认为@denniswilliamson的答案(使用-m选项)对于(通常)更易于移植和处理不存在的文件更为有利。
- 或者是弗利姆的答案;两者都是很好的解决方案。不过班尼埃最能回答我原来的问题。
- OSX用户:查看此答案
realpath试试。
1 2
| $ realpath example.txt
/home/username/example.txt |
- +1、程序非常好。但请注意,它是一个外部命令(不是内置的shell),默认情况下,它可能不会出现在每个系统中,也就是说,您可能需要安装它。在Debian中,它驻留在一个具有相同名称的单独包中。
- 正是我要找的,谢谢!唯一的问题是为什么我自己找不到这个…
- 的确,它不是内置的,但这通常只是使用锁定的大学计算机时的一个问题。
- 我在路径中添加了一个realpath,其中包括:github.com/westonruter/misc-cli-tools/blob/master/realpath
- 如果传递的文件名不存在,则不起作用。
- @它仍然会给你一个有效的路径,给定一些相对路径。如果你想知道文件的存在,可以使用另一个工具,比如test。
- @洪克:不,不是。realpath file_that_does_not_exist只是给了我一个错误:"文件不存在:没有这样的文件或目录",我在Ubuntu上使用realpath 1.17版。
- @好吧,我不知道。我使用GNU coreutils 8.21中的实现。
- @达林:尝试安装coreutils。二进制文件名为grealpath。
- 这个工具是在GNU coreutils 8.15(2012年)中引入的,所以它是相当新的。
- @flimm,您希望如何获得不存在的文件的完整路径?
- @瓦西里斯:很简单,如果文件存在的话,它会告诉我文件的路径。例如,无论.bashrc是否存在,realpath .bashrc都可以返回/home/username/.bashrc。
- @我不同意我的朋友。系统无法知道文件的位置!好吧,.bashrc是一个非常常见的文件,但是myfile.txt呢?
- @假设我在命令行上运行vim myfile.txt。维姆怎么知道该往哪里看?myfile.txt可以在文件系统的任何地方!vim知道在当前目录中查找,它知道如何在知道文件是否存在之前将相对路径转换为绝对路径。如果文件不存在,vim将在该绝对路径上打开一个新文件。它不会混淆,它总是知道如何将相对路径转换为绝对路径,不管文件是否存在。
- @flimm,你拿.bashrc的例子让我困惑,我以为即使你不在主目录中,你也会期待完整的路径。现在我明白你的意思了!
- RealPath存在于OSX(又称MacOS)上,截至2018年或更早可能
- @紫色夹克高塞拉没有,甚至V10.13.6。从莫哈韦开始肯定是这样。
- 这并不完全符合OP的要求:它还解析路径中的任何符号链接。
这将尝试解决readlink符号链接:
1
| readlink -e /foo/bar/baz |
- 我宁愿使用"-f"而不是"-e",这样我们就可以看到不存在文件的绝对路径。
- 这对我来说是最简单的,同时也是便携的。readlink是gnu coreutils的端口,所以它将安装在几乎所有的Linux发行版上,除了一些嵌入式发行版。
- 在我看来,-m是最好的选择。
- 在OSX上找不到
- @大林:小牛队的1号[3号]。或者你是说那些选项在OSX上找不到?这似乎是一个发育不全的BSD版本…P
- hluk:-f选项也是在OpenBSD中使用的选项。
- @iconoclast这些选项在OSX上不可用,并且根据BSD readlink手册页:only the target of the symbolic link is printed. If the given argument is not a symbolic link, readlink will print nothing and exit with an error,因此readlink在OSX上不能用于此目的。
- @dalin这些选项可以通过安装gnu coreutils找到。
- 适用于MacOS 10.3(Mavericks)
1 2
| #! /bin/sh
echo"$(cd"$(dirname"$1")"; pwd -P)/$(basename"$1")" |
- 别忘了引用所有的东西。如果您不明白原因,请在文件a b上尝试您的程序(A和B之间有两个空格,因此会吃掉其中一个)。
- 也可以在"/"上尝试,它会变成"//"
- 目前唯一不需要编写和编译可执行文件的POSIX解决方案是,因为readlink和realpath不是POSIX。
- 我想@roman cheplyaka得到的是:$(cd"$(dirname"$1")"&;&;pwd)
- 我用function realpath { echo $(cd $(dirname $1); pwd)/$(basename $1); }在osx上做了一个realpath命令(目前接受的答案)。谢谢!
- 我用这个方法定义脚本的日志文件名:LOG=$(echo $(cd $(dirname $0); pwd)/$(basename $0 .sh).log)。
- 至少在OSX 10.10.3上,这不会扩展到文件的符号链接。我不明白这有什么帮助。例如,在ln -s ~/src/myutil/myutil.sh ~/bin/; realpath ~/bin/myutil.sh中,命令myutil.sh尝试使用realpath查找myutil.ini,但在~/bin中找不到它,因为它在~/src/myutil中。/
- @brunobronosky这个答案符合问题的要求,在某些情况下是有用的。您似乎对这个问题感兴趣,它还包括扩展符号链接(也称为规范化):unix.stackexchange.com/questions/24293/&hellip;
- 很好的回答!我对它进行了一点扩展以处理这样的名称。…/正确的等等,作为一个单独的答案。
- @Jamesbedford这不是正确的realpath实现,因为它不能解析符号链接。
- 你说得对!为了解决符号链接,需要给pwd一个-P参数。我会继续编辑答案。谢谢!
忘记系统上可能安装或不安装的readlink和realpath。
在上面对Dogbane的答案进行扩展,它表示为一个函数:
1 2 3 4 5
| #!/bin/bash
get_abs_filename() {
# $1 : relative filename
echo"$(cd"$(dirname"$1")" && pwd)/$(basename"$1")"
} |
然后您可以这样使用它:
1
| myabsfile=$(get_abs_filename"../../foo/bar/file.txt") |
它如何工作,为什么工作?
该解决方案利用了这样一个事实:bash内置的pwd命令在不带参数调用时将打印当前目录的绝对路径。
为什么我喜欢这个解决方案?
它是可移植的,不需要readlink或realpath,这通常不存在于给定的linux/unix发行版的默认安装中。
如果dir不存在怎么办?
如上所述,如果给定的目录路径不存在,函数将失败并在stderr上打印。这可能不是你想要的。您可以展开函数来处理这种情况:
1 2 3 4 5 6 7
| #!/bin/bash
get_abs_filename() {
# $1 : relative filename
if [ -d"$(dirname"$1")" ]; then
echo"$(cd"$(dirname"$1")" && pwd)/$(basename"$1")"
fi
} |
现在,如果父目录不存在,它将返回一个空字符串。
如何处理输入中的后缀".."或"."?
在这种情况下,它确实给出了一条绝对路径,但不是最小路径。它看起来像:
如果要解析"..",需要使脚本如下:
1 2 3 4 5 6 7 8 9 10 11
| get_abs_filename() {
# $1 : relative filename
filename=$1
parentdir=$(dirname"${filename}")
if [ -d"${filename}" ]; then
echo"$(cd"${filename}" && pwd)"
elif [ -d"${parentdir}" ]; then
echo"$(cd"${parentdir}" && pwd)/$(basename"${filename}")"
fi
} |
- 很好的功能,但显然你不懂的问题。我想我需要的脚本的交互使用。
- dhardy @。我知道你不知道我。是什么在这里提出的解决方案是使用排除从互动的环境?……顺便说一句,就像所有其他的备选答案在这个页面上提出的。
- 好的,我nolan6000,包含脚本的能力(如果这样做在inelegant)然后问这样的问题,如果有一个标准的Unix实用程序做同样的事情。我的所有其他的答案太惊讶的廉洁realpath封面原始用例和一些相关的情况下一个答案,但没有帮助。
- 无论是NOR realinkrealpathA标准的UNIX工具,如果这就是你,然后你走了后一个错误的答案。
- 有你有我。是什么,我realpath安静后,当我问这样的问题没有标准,它是可用作为包装上使用我所有的Linux分布位置。
- 我想添加一realpath来自coreutils工具包,其中包含如who所以,touch或cat。它的好和国际学院的GNU工具集,所以你可以相当确信这是安装在几乎任何基于Linux的机器。这是说,你是正确的:有2个问题:1)你用它,它可能会在非默认安装小姐在GNU的UNIX系统(II)这样的OpenBSD)工具介绍8.15什么版本(很好的新的,所以你想在2012年,M)吃它的长期稳定系统(样RHEL 6)。
- 嗯,似乎至少是连续Analytics(庄家的PythonPython分发)喜欢这个答案。它是实现(一个链接回参考这里)"激活",在他们的脚本,这是用来激活虚拟环境漫游康达工具创建的。那么……好!
- 这只适用于目录(因为没有其他目录),不能处理".."和"."。请看我的答案:stackoverflow.com/a/23002317/2709
- @亚历山德罗克利梅特谢克。你完全正确。我想让存根保持简单。然后其他人可以根据自己的需要扩展它。正如你所做的。好极了!.
- 谢谢,但就我个人而言,我只是为了让它更适合剪贴板。
- @Ubuntu 14.04或Debian Wheezy上不存在Marbu RealPath。随着时间的推移,它可能变得有些标准,但现在肯定不是。还要注意,操作系统没有提到Linux或GNU。bash比它更广泛地使用。
- 如果它在适当的时候给出错误(包括在作为输入的空字符串上操作时),那么以增大为代价,这样做会更好。
- 如何处理符号链接
1 2
| $ readlink -m FILE
/path/to/FILE |
这是一readlink -e FILE或realpath比,因为它的工作,如果文件是不是存在。
- 在OSX上找不到readlink
- 很好。这也适用于确实存在但不是符号链接的文件/目录。
- 我在OS X 10.9(Mavericks)上有readlink,所以这绝对是最好的答案。
- @肯尼斯豪斯:小牛队不提供-m选项。
- 当然,它不在默认的OSX安装上。
- 在Linux(CentOS)上工作谢谢,因为RealPath不存在。
绝对路径转换器外壳函数的相对路径
- 不需要公用设施(仅cd和pwd)
- 适用于目录和文件
- 处理..和.。
- 处理目录或文件名中的空格
- 要求文件或目录存在
- 如果给定路径中不存在任何内容,则返回Nothing
- 作为输入处理绝对路径(基本上通过它们)
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| function abspath() {
# generate absolute path from relative path
# $1 : relative filename
# return : absolute path
if [ -d"$1" ]; then
# dir
(cd"$1"; pwd)
elif [ -f"$1" ]; then
# file
if [[ $1 = /* ]]; then
echo"$1"
elif [[ $1 == */* ]]; then
echo"$(cd"${1%/*}"; pwd)/${1##*/}"
else
echo"$(pwd)/$1"
fi
fi
} |
Sample:
1 2 3 4 5 6 7 8
| # assume inside /parent/cur
abspath file.txt => /parent/cur/file.txt
abspath . => /parent/cur
abspath .. => /parent
abspath ../dir/file.txt => /parent/dir/file.txt
abspath ../dir/../dir => /parent/dir # anything cd can handle
abspath doesnotexist => # empty result if file/dir does not exist
abspath /file.txt => /file.txt # handle absolute path input |
注意:这是基于nolan6000和bsingh的答案,但修复了文件大小写。
我也理解最初的问题是关于现有的命令行实用程序。但由于这似乎是有关stackoverflow的问题,其中包括希望具有最小依赖性的shell脚本,因此我将此脚本解决方案放在此处,以便稍后找到它:)
- 谢谢。这就是我在OSX上要做的
- 这不适用于带有空格的目录,例如:$ abspath 'a b c/file.txt',这是因为cd的参数没有被引用。为了克服这一点,而不是把整个论据都引用给echo(有没有理由引用这些论据?)只引用路径参数。即用echo $(cd"${1%/*}"; pwd)/${1##*/}代替echo"$(cd ${1%/*}; pwd)/${1##*/}"。
- @乔治,谢谢你的提醒,我把它修好了。
- 我看了几十个半圆的解决方案,这显然是最简洁和准确的bash-only解决方案。你可以用(cd"$1"; pwd)代替echo"$(cd"$1"; pwd)",使它更薄。这里不需要回声。
- @六对,更新。仍然需要大括号( ... ),因此cd发生在子shell中,因为我们不想更改abspath的任何调用方的工作目录。
- 这是一个经过深思熟虑的答案,但它不适用于指向文件的符号链接,只适用于指向目录的链接。因此,如果有一个脚本在脚本所在的目录中查找配置文件,则无法将该脚本符号链接到~/bin。对于受版本控制的工具来说,这是非常常见的做法。
- @Brunobronoosky它对我的符号链接很好。你有没有一个不起作用的例子?请注意,它将返回绝对路径(对于基于您传入的符号链接的符号链接),而不是"规范"路径,我将考虑使用单独的工具/函数,因为在一个简单的shell函数中可能更难实现。
- 我在寻找类似readlink的东西,它提供了扩展了symlink的realpath。经过仔细研究,这不是正确的问题。
- 亚历山大,非常感谢!我在file分支中编辑了if [[ $1 = /* ]] ; then echo"$1" ; elif [[ $1 = */* ...,这样它也可以处理绝对路径作为输入。
- @谢谢,很好的发现。这只是一个单级绝对文件路径的问题,如/file.txt,而/dir或/dir/file.txt以前工作过。我把你的零钱合并在一起,把它修好了。
该命令可以帮助find
1 2
| find $PWD -name ex*
find $PWD -name example.log |
下面列出的所有文件在当前目录的名称或与之匹配的模式。它可以简化,如果你只会得到一些结果(例如,目录树的底部附近,几只含文件)
我使用这个在线的Solaris 10,这是不是已经提到的其他工具。
- 我没有在第一次阅读时对这个评论进行摸索;这里的关键点是,如果给find命令一个绝对路径,那么它将以绝对路径输出结果。所以使用$pwd是你所处位置的绝对路径,所以你得到的输出是绝对的。
- 如果你依赖于PWD,你可以简单地使用$PWD/$filename。
- 这比公认的答案好得多。
- 使用-maxdepth 1可以改进这种方法。另外,不要忘记引用——这里可能存在安全问题,这取决于您如何使用它。
- @如果$filename已经是绝对的,jonny:$pwd/$filename将失败。
- 如果文件名指定为"./file name.txt"(带前导点和斜杠),则此操作失败。
- 如果文件名的多个匹配项低于$pwd,则失败。如果目录很多,速度会很慢。
如果你不有一个比你可以或公用事业readlink realpath使用功能后,作品在bash和zsh(不确定关于the Rest)。
1 2 3
| abspath () { case"$1" in /*)printf"%s
""$1";; *)printf"%s
""$PWD/$1";; esac; } |
本厂是nonexistent文件(也做os.path.abspath的Python函数。
不幸的是abspath ./../somefile不是摆脱该点。
- 在我看来很轻便。另一方面,将中断,例如在包含换行符的文件名上。
- 是的,你是对的。我已经把grep完全删除了。
- 为了进一步改进,用printf"%s
""$1"代替echo"$1"(同第二个echo)。echo可以解释其论点中的反斜杠。
- 你又是对的!实际上,zsh中echo命令的行为与bash不同。
- 严格地说,如果参数包含反斜杠,那么在posix下echo的行为是未定义的。但是,它是在XSI扩展下定义的(即,echo应该解释转义序列)。但是bash和zsh都离posix的遵从性还差得很远…
- 对不起,但我不明白这一点。我已经提供了一个作为脚本的答案,它具有更多的特性,因此不需要在shell脚本中使用。
这是只有在zsh是它的功能我喜欢它们。它使用了"国有企业"zshexpn展开修改器(1)。
1
| realpath() { for f in"$@"; do echo ${f}(:A); done } |
这样的事情有一个大致的absolute path到文件(这意味着语句可以有一个以上的在一般的定,因此使用的是不适当的文章)。这是一absolute path启动任何路径从根"/"和designates ambiguity没有独立的文件的工作目录(见例如维基百科)。。。。。。。。。。。。。。
这是一relative path路径是从另一个是interpreted启动目录。它可能是,如果它的工作目录是由人的relative pathmanipulated应用(虽然不一定)。当它是一个符号链接在目录中,它是相对于一般的目的是目录(虽然可能有其他用户使用的记忆中)。
因此一个绝对路径是只是相对于根目录的路径。
路径(绝对或相对)可能或可能不包含的符号链接。如果它不,它是有点impervious也对链接结构变化的必然要求,但这不是一desirable或盈亏平衡点。一些人(或canonical file name或呼叫canonical pathresolved path)在其中的所有符号链接的一absolute path已分辨,即已被替换由whetever路径链接到他们。《命令与readlinkrealpath正则路径都看,但只有一个是有一realpath期权获得了绝对路径的符号链接(没有bothering随着一些其他选项,以获得不同的一种绝对或相对路径,一些目录)。
这将调用的话:
符号链接也可以只可分辨的,如果他们是应该创建一个链接到已经是显然的,永远不结婚。《命令与readlinkrealpath到客户那一选项。
该指南的路径后,可以成为符号链接路径,这意味canonical不再是。因此在时间(或环境)的概念是相关的。
即使在理想的案例,当所有的符号链接可以分辨。还可以有一个以上的canonical path是到文件,双原因:
- 该分区上的文件可能有一个含(山ro)同时在线的几个点。
- 有可能是该文件的硬链接的文件存在的意义,本质上,在几个不同的目录。
因此,即使与多canonical path有限制性的定义,可以对几种典型路径下的文件。这也意味canonical不少,因为它是一个有点比赛通常意味着其唯一性的概念。
这扩大了简短的讨论的话题在一到另一个类似的问题的答案:在检索了绝对路径的相对的bash
我的结论是,realpath是更好的设计和更大的比readlink灵活。这是唯一的使用不受realpathreadlink呼叫是没有返回值的选择对符号链接。
- 我不介意被否决,但我喜欢理解为什么这样我才能学到一些东西,无论是技术上的还是关于什么是在网站上被认为是适当的实践。好。。。至少它促使我注册元栈溢出以更好地理解当地社会学。我确实推荐它。--不过,如果有人对我的回答不恰当有意见,我很感兴趣。
- (a)这个问题有一个2+1/2年前的有效答案,(b)有一个(单一)绝对路径对应于一个相对路径(这是我想要的),尽管可能不是你指出的文件。顺便说一句,任何关于realpath和readlink的评论,甚至是关于符号链接的评论都是多余的。
- 第二条评论:简短的回答往往比长时间的演讲更有用。堆栈溢出通常用于问特定的问题。
- @谢谢你抽出时间详细回答。我发现了解这个网站上的沟通交流,并澄清我对这个话题的看法是非常有帮助的。关于你提出的具体问题,请允许我更详细地回答。
- 1-一个问题有一个有效答案的时间很长,这并不意味着它已经结束。这些问题不仅供个人使用。事实上,回复的徽章收集的选票比经过验证的答案多。使用新的工具,"最佳"的答案会随着时间的推移而改变。许多人使用通过网络搜索获得的旧答案。
- 2-您坚持认为有一个(单个)绝对路径对应于一个相对路径。虽然我猜你所说的"对应"是什么意思,也就是说,通过给定的一组转换从原始文件派生出的路径,但你的语句仍然是错误的。有一个唯一的"对应"规范路径。单词canonical精确地指的是相对于一组转换的这种唯一性。但是,例如,/dev/cdrom是一个非常好的绝对路径,即使它实际上是指向/dev/sr0的链接。两个都指向同一个设备。我的原始答案指向了一篇相关的网络文章。
- 3-由于有许多建议的解决方案作为答案,因此对读者来说,对答案进行比较评估、了解原因以及了解如何解决可能很有用。我正好同意你的回答,但那无关紧要。我花了一段时间(比你想象的要多得多)来适应这种评估,我试图把这项工作留给别人。有时我会编辑自己的问题来解释为什么我选择了一个给定的答案,以帮助未来的读者。实际上,关于realpath和readlink,似乎存在一些争议。
- 4-Short answers are very often more useful than long lectures。你完全正确。如果你回到我原来的答案,你会发现只有8行。虽然我不知道这个问题是技术性的还是语言性的,但由于被否决而没有解释,我认为我必须更加准确。为了我自己的利益,我开始写这篇文章,把它留在那里是因为它很方便,因为我仍然希望得到回应。但同样的问题在很多地方被问到。
- 我看不出这个答案在宣扬什么。路径绝对化的算法非常清晰明确:absolute_path = path if is_absolute(path) else current_dir + sep + path。谁在乎如果fs支持symlinks,那么许多绝对路径是可能的?这个问题不要求如何比较它们!
- @伊凡·波兹代夫忙着一周。不能早点回答(东西5岁了)。问题是要求一个命令。你的答案是合成的。接受的答案建议realpath是一个单独的命令。另一个是readlink。但是没有人解释他们做什么,结果可能足够,或者不足够,因为没有绝对路径的唯一性(尽管问题中隐含的是唯一性),并且他们的行为并不总是相同的,这取决于以后的使用。您的答案可能不正确,这取决于上下文、结果的预期用途,这是一段稍后要解释的文本。
- 所以这是对其他答案的评论,并没有给出任何答案。这正是让我恼火的地方:这些都是离题的。
- "伊万_ pozdeev在没有其他答案A的话单。第一,是浴室的问题。这是我的第一句话在我原来的(短)的答案。我让它为用户设置的时间点是更微妙的比我的预期。答案是没有,但不安全的使用。可以说,没有动手术,但他的phrasing什么问题使它清晰一点。我需要在commenting其他问题回答不够完整,但不给任何不必要考虑的隐信息可能是在一个赌注,这并unbeknownst同意手术。在这样的政策。
- "伊万_ pozdeev我第一点出你如何让同样的错误作为手术。你要描述的是单向的绝对路径。这不是唯一的一个,和他们不给所有相同的效果。你呼叫它的算法,从而implying,它是独特的,或至少给了他们所有的等效的结果,这是错误的。什么是你要的答案A的一个独特的,尤其是如果你知道有其他人,但不知道这是更适当的。
- 我是一个算法的隐含了一个是"默认",一个"绝对路径"是隐含在上述没有任何进一步的资格。"手术"不可能绝对路径的所有买卖",除非他们说,否则,这是隐含的。判断由OP的行动,他们的任何可能的精细的答案。
- "伊万_ pozdeev那是5年前,我不记得确切的思维路径。我已经读了所有的答案,知道可能是陷阱。如果他们选择的手术方式应该是你的国家,那么所有的答案是错误的情况下(但不要忘记他们downvoting:)。一个超过100 upvote当我回答。虽然符号链接可以扩充,我意识到它是不可取的(通常为你的内容太),但我想是因为它isssue constructively地址可以帮助一些用户。解释为什么一个比其他的选择可能是在回答。
dogbane回答了以下问题:
1 2
| #! /bin/sh
echo"$(cd"$(dirname"$1")"; pwd)/$(basename"$1")" |
说明:
这个脚本得到相对路径作为参数"$1"
然后我们得到该路径的dirname部分(您可以将dir或file传递给这个脚本):dirname"$1"
然后我们进入这个相对目录,通过运行pwdshell命令得到它的绝对路径。
之后,我们将basename附加到绝对路径:$(basename"$1")。
作为最后一步,我们决定
这不是问题的答案,但对于编写脚本的人来说:
1
| echo `cd"$1" 2>/dev/null&&pwd||(cd"$(dirname"$1")";pwd|sed"s|/*\$|/${1##*/}|")` |
它处理/。等正确。我也在OSX上工作
我在系统上放置了以下脚本,当我想快速获取当前目录中文件的完整路径时,将其称为bash别名:
1 2
| #!/bin/bash
/usr/bin/find"$PWD" -maxdepth 1 -mindepth 1 -name"$1" |
我不知道为什么,但在OSX上,当脚本"$pwd"调用时,它会扩展到绝对路径。当在命令行上调用find命令时,它不会调用。但它会执行我想要的操作…享受。
- $PWD始终具有工作目录的绝对路径。另外,find也不能容忍猛砍,所以你没有按要求回答问题。做你想做的事情的一个更快的方法就是echo"$PWD/$1"
对于目录dirname,../触发并返回./。
可以修改nolan6000的功能来修复:
1 2 3 4 5 6
| get_abs_filename() {
# $1 : relative filename
if [ -d"${1%/*}" ]; then
echo"$(cd ${1%/*}; pwd)/${1##*/}"
fi
} |
- 欢迎光临!对于小的改动和评论,在现有答案中添加评论可能比添加答案更合适,特别是如果复制的答案缺少原始答案的许多其他信息。一旦你获得了更多的声誉,你就可以在别人的答案中添加评论。现在,试着通过提出独特的、有价值的问题或提供独立的、好的答案来收集声誉。
- 既然你提到的是诺兰6000的答案,请注意,海报达迪已经评论说,他不会接受诺兰6000的答案,因为他没有寻找剧本。所以严格来说,你的答案并不能回答问题。
- 该功能可添加到.profile中,因此可供交互使用。
- 如果$1是一个普通的文件名:get_abs_filename foo->nothing(如果foo是一个目录,那么这将不起作用)。
1 2 3 4
| #! /bin/bash
file="$@"
realpath"$file" 2>/dev/null || eval realpath $(echo $file | sed 's/ /\\ /g') |
这弥补了realpath的缺点,将其存储在shell脚本fullpath中。您现在可以拨打:
1 2 3 4 5 6 7
| $ cd && touch a\ a && rm A 2>/dev/null
$ fullpath"a a"
/home/user/a a
$ fullpath ~/a\ a
/home/user/a a
$ fullpath A
A: No such file or directory. |
- 它能解决什么问题?realpath"foo bar"->/home/myname/foo bar。如果您不介意引用命令行参数,那不是realpath的错误。
- 同意,这更像是一个方便包装。
在Ruby中获取绝对路径的另一种方法是:
realpath() {ruby -e"require 'Pathname'; puts Pathname.new('$1').realpath.to_s";}
不使用参数(当前文件夹)和相对和绝对文件或文件夹路径作为参数。
嘿,伙计们,我知道这是一条老线索,但我只是把它贴出来,以供其他像我一样访问过这个网站的人参考。如果我正确理解了这个问题,我认为是由locate $filename指挥的。它显示所提供文件的绝对路径,但仅当它存在时才显示。
- locate是一个按名称搜索文件/路径的实用程序。它可以执行此任务,但也可以找到其他匹配项,如果不首先调用updatedb作为根目录,则可能无法找到现有文件。