关于Linux:如何获取文件的完整路径?

How to get full path of a file?

有没有一种简单的方法可以打印file.txt的完整路径?

1
file.txt = /nfs/an/disks/jj/home/dir/file.txt

江户十一〔一〕号

1
dir> <command> file.txt

应该打印

1
/nfs/an/disks/jj/home/dir/file.txt


使用RealLink:

1
readlink -f file.txt


我想您使用的是Linux。

我在coreutils 8.15中找到了一个名为realpath的实用程序。

1
2
realpath file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt

根据@styrofoam fly和@arch standton的评论,单是realpath没有检查文件是否存在,为了解决这个问题,增加了e的论点:realpath -e file


以下通常是技巧:

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


我知道有一个更简单的方法,但如果我能找到它…

1
2
jcomeau@intrepid:~$ python -c 'import os; print(os.path.abspath("cat.wav"))'
/home/jcomeau/cat.wav


1
2
jcomeau@intrepid:~$ ls $PWD/cat.wav
/home/jcomeau/cat.wav


1
find $PWD -type f | grep"filename"

1
find $PWD -type f -name"*filename*"


如果与文件位于同一目录中:

1
ls"`pwd`/file.txt"

file.txt替换为目标文件名。


在Windows中,您可以:

  • 按住SHIFT键,右键单击一个文件,您可以选择名为"Copy as Path"的文件。这将把文件的完整路径复制到剪贴板。

在Linux中,可以使用以下命令:

  • realpath yourfile获取一个文件的完整路径,正如许多人所建议的那样。

我知道这是一个古老的问题,但只是为了补充以下信息:

Linux命令which可用于查找命令文件的文件路径,即

1
2
$ which ls
/bin/ls

对此有一些警告;请参阅https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/。


适用于Mac、Linux、*nix:

这将为您提供当前目录中所有文件的带引号的csv:

1
ls | xargs -I {} echo"$(pwd -P)/{}" | xargs | sed 's/ /","/g'

它的输出可以很容易地复制到python列表或任何类似的数据结构中。


您可以使用fpn(完整路径名)脚本:

1
2
3
4
5
6
7
8
9
10
% 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项目,您可以在一分钟内设置它。


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

这是对@zeremz答案的解释:

  • 这个脚本得到相对路径作为参数"$1"
  • 然后我们得到该路径的dirname部分(您可以将dir或file传递给这个脚本):dirname"$1"
  • 然后我们把这个相对的方向
  • 得到绝对路径。-P选项将避免所有符号链接
  • 之后,我们将basename附加到绝对路径:$(basename"$1")
  • 作为最后一步,我们决定

  • 对于MacOSX,我替换了操作系统附带的实用程序,并用较新版本的coreutils替换了它们。这允许您访问Mac上的工具,如readlink -f(文件的绝对路径)和realpath(目录的绝对路径)。

    自制版本在命令名前面附加了一个"g"(用于GNU工具),因此等价物变成了greadlink -f FILEgrealpath DIRECTORY

    有关如何通过自制在Mac OS X上安装coreutils/gnu工具的说明,请参阅StackExchange Arcticle。

    注意:对于非mac-unix用户,readlink -frealpath命令应该是现成的。


    在类似的场景中,我将从其他位置启动CShell脚本。为了设置脚本的正确绝对路径,使其仅在指定目录中运行,我使用以下代码:

    1
    set script_dir = `pwd`/`dirname $0`

    $0存储脚本执行方式的确切字符串。

    例如,如果脚本是这样启动的:$> ../../test/test.csh$script_dir将包含/home/abc/sandbox/v1/../../test


    在下面提到的mac中,线路工程。不需要添加任何花哨的线条。

    1
    > pwd filename


    这对我很管用。它不依赖于文件系统(取决于需要的pro/con),所以速度很快;而且,它应该可以移植到大多数*nix。它确实假定传递的字符串是相对于pwd的,而不是其他目录。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    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} \'
    }

    您可以使用此功能。如果给定的文件名没有相对路径,则假定该文件名存在于当前工作目录中:

    1
    abspath() { old=`pwd`;new=$(dirname"$1");if ["$new" !="." ]; then cd $new; fi;file=`pwd`/$(basename"$1");cd $old;echo $file; }

    用途:

    1
    2
    $ abspath file.txt
    /I/am/in/present/dir/file.txt

    使用相对路径:

    1
    2
    $ abspath ../../some/dir/some-file.txt
    /I/am/in/some/dir/some-file.txt

    文件名中包含空格:

    1
    2
    $ abspath"../../some/dir/another file.txt"
    /I/am/in/some/dir/another file.txt

    这是幼稚的,但我必须使它符合POSIX。需要CD进入文件目录的权限。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #!/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}

    您可以将其保存在"shell.rc"中,也可以直接放在控制台中。

    function absolute_path { echo"$PWD/$1"; }

    alias ap="absolute_path"

    例子:

    ap somefile.txt

    意志输出

    /home/user/somefile.txt


    通常:

    1
    find `pwd` | grep <filename>

    或者,只针对当前文件夹:

    1
    find `pwd` -maxdepth 1 | grep <filename>


    1
    find / -samefile file.txt -print

    将找到与file.txt具有相同inode编号的文件的所有链接

    添加-xdev标志将避免find跨越设备边界("安装点")。(但如果find不在与file.txt相同的设备上的目录中启动,这可能会导致什么也找不到)

    请注意,find可以为单个文件系统对象报告多个路径,因为inode可以由多个目录条目链接,甚至可能使用不同的名称。例如:

    1
    find /bin -samefile /bin/gunzip -ls

    意志产出:

    1
    2
    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

    这对文件和文件夹都有效:

    1
    2
    3
    4
    getAbsolutePath(){
        [[ -d $1 ]] && { cd"$1"; echo"$(pwd -P)"; } ||
        { cd"$(dirname"$1")" || exit 1; echo"$(pwd -P)/$(basename"$1")"; }
    }

    我喜欢已经给出的许多答案,但我发现这确实有用,特别是在获取文件完整路径的脚本中,包括以下符号链接和相关引用,如...

    1
    dirname `readlink -e relative/path/to/file`

    从根路径开始返回EDOCX1的完整路径(24)。这可以在脚本中使用,以便脚本知道它从哪个路径运行,这对于可以位于计算机上任何位置的存储库克隆非常有用。

    1
    basePath=`dirname \`readlink -e $0\``

    然后,我可以在脚本中使用${basePath}变量直接引用其他脚本。

    希望这有帮助,

    戴夫


    在Mac OSX中,执行以下步骤:

  • cd进入目标文件的目录。
  • 键入以下任一终端命令。
  • 终点站

    1
    2
    ls"`pwd`/file.txt"
    echo $(pwd)/file.txt
  • file.txt替换为实际文件名。
  • enter

  • 这同时适用于Linux和Mac OSX。

    1
     echo $(pwd)$/$(ls file.txt)


    另一个Linux实用程序,执行此任务:

    1
    fname <file>

    对于Mac OS,如果只想在查找器中获取文件的路径,请控制单击该文件,然后向下滚动到底部的"服务"。您有许多选择,包括"复制路径"和"复制完整路径"。单击其中一个将路径放在剪贴板上。


    1
    2
    3
    4
    5
    6
    fp () {
    PHYS_DIR=`pwd -P`
    RESULT=$PHYS_DIR/$1
    echo $RESULT | pbcopy
    echo $RESULT
    }

    将文本复制到剪贴板并在终端窗口上显示文本。

    :)

    (我从另一个堆栈溢出应答中复制了一些代码,但无法再找到该应答)


    要获取文件的完整路径:

    1)按键盘上的以下键,打开包含文件的文件夹中的终端:

    ctrl+alt+t

    2)然后键入"pwd"(工作目录打印名的首字母缩写):

    1
    your@device ~ $ pwd

    全是伙计们!


    最简单的方法是

    1
    for i in `ls`; do echo"`pwd`/$i"; done

    它对我很管用


    创建如下函数(将文件的绝对路径与pwd相呼应,并将文件添加到路径末尾:

    1
    abspath() { echo $(pwd"$1")/"$1"; }

    现在您可以找到任何文件路径:

    1
    abspath myfile.ext

    除了"readlink-f",另一个常用命令:

    1
    2
    3
    $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/it/to/myfile
    $

    这还提供了控制台上的完整路径和文件名

    主题外:这个方法只提供相对链接,而不是绝对链接。readlink -f命令是正确的。


    这将为您提供文件的绝对路径:

    1
    find / -name file.txt