为了账号安全,请及时绑定邮箱和手机立即绑定

bash / fish命令打印文件的绝对路径

/ 猿问

bash / fish命令打印文件的绝对路径

牛魔王的故事 2019-11-22 11:17:15

问题:是否有一个简单的sh / bash / zsh / fish / ...命令来打印我提供的文件的绝对路径?


用例:我在目录中/a/b,我想c在命令行上打印文件的完整路径,以便可以轻松地将其粘贴到另一个程序:中/a/b/c。一个简单而又简单的程序可以在处理长路径时为我节省5秒钟左右的时间,最终加起来。因此,令我惊讶的是我找不到标准的实用程序来执行此操作-真的没有吗?


这是一个示例实现abspath.py:


#!/usr/bin/python

# Author: Diggory Hardy <diggory.hardy@gmail.com>

# 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)


查看完整描述

3 回答

?
翻翻过去那场雪

尝试realpath。


$ realpath example.txt

/home/username/example.txt


查看完整回答
反对 回复 2019-11-22
?
梵蒂冈之花

尝试readlink解析符号链接:


readlink -e /foo/bar/baz


查看完整回答
反对 回复 2019-11-22
?
qq_花开花谢_0

忘掉readlink和realpath可能会或可能不会被你的系统上安装。


在这里扩展狗狗的答案,它表示为一个函数:


#!/bin/bash

get_abs_filename() {

  # $1 : relative filename

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

}

然后可以像这样使用它:


myabsfile=$(get_abs_filename "../../foo/bar/file.txt")

它如何以及为什么起作用?

该解决方案利用了以下事实:pwd当不带参数调用时,Bash内置命令将显示当前目录的绝对路径。


我为什么喜欢这种解决方案?

它是可移植的,不需要,readlink或者realpath在给定的Linux / Unix发行版的默认安装中通常不存在。


如果dir不存在怎么办?

如上所述,如果给定的目录路径不存在,该功能将失败并在stderr上打印。这可能不是您想要的。您可以扩展功能来处理这种情况:


#!/bin/bash

get_abs_filename() {

  # $1 : relative filename

  if [ -d "$(dirname "$1")" ]; then

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

  fi

}

现在,如果父目录不存在,它将返回一个空字符串。


您如何处理尾随的“ ..”或“。” 在输入?

好吧,在这种情况下,它确实提供了一条绝对的路径,但不是一条最小的路径。它看起来像:


/Users/bob/Documents/..

如果要解析“ ..”,则需要使脚本类似:


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

}


查看完整回答
反对 回复 2019-11-22

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信