如何获取文件的完整路径?
- 2024-10-21 09:14:00
- admin 原创
- 91
问题描述:
有没有一种简单的方法可以打印出完整路径file.txt
?
file.txt = /nfs/an/disks/jj/home/dir/file.txt
这<command>
dir> <command> file.txt
应该打印
/nfs/an/disks/jj/home/dir/file.txt
解决方案 1:
使用readlink:
readlink -f file.txt
解决方案 2:
我假设您正在使用 Linux。
我realpath
在 coreutils 8.15 中发现了一个名为的实用程序。
realpath -s file.txt
/data/ail_data/transformed_binaries/coreutils/test_folder_realpath/file.txt
由于问题是关于如何获取文件的完整/绝对路径,而不是如何获取符号链接的目标,因此使用-s
或--no-symlinks
表示不扩展符号链接。
根据 @styrofoam-fly 和 @arch-standton 的评论,realpath
单独并不检查文件是否存在,为了解决这个问题,请添加e
参数:realpath -e file
解决方案 3:
下面的方法通常可以达到这样的效果:
echo "$(cd "$(dirname "$1")" && pwd -P)/$(basename "$1")"
解决方案 4:
我知道有比这更简单的方法,但我找不到它……
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
解决方案 5:
在 Windows 上:
在 Windows 资源管理器中按住
Shift
并右键单击文件,您将看到一个名为的选项Copy as Path
。这会将文件的完整路径复制到剪贴板。
在 Linux 上:
您可以按照其他人的建议使用该命令
realpath yourfile
来获取文件的完整路径。
解决方案 6:
find $PWD -type f | grep "filename"
或者
find $PWD -type f -name "*filename*"
解决方案 7:
如果您与该文件位于同一目录中:
ls "`pwd`/file.txt"
替换file.txt
为您的目标文件名。
解决方案 8:
我知道这是一个老问题,但只是想在这里补充一些信息:
Linux命令which
可用于查找命令文件的文件路径,即
$ which ls
/bin/ls
对此有一些注意事项;请参阅https://www.cyberciti.biz/faq/how-do-i-find-the-path-to-a-command-file/。
解决方案 9:
您可以使用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 项目,您可以在一分钟内完成设置。
解决方案 10:
适用于 Mac、Linux、*nix:
这将为您提供当前目录中所有文件的引用 csv:
ls | xargs -I {} echo "$(pwd -P)/{}" | xargs | sed 's/ /","/g'
其输出可以轻松复制到 Python 列表或任何类似的数据结构中。
解决方案 11:
该解决方案使用 Ubuntu 22.04 上存在的命令,但通常也存在于大多数其他 Linux 发行版中,除非它们对于 s'mores 来说太过硬核。
在 Linux 或 Mac 上获取文件完整路径的最短方法是使用ls
命令和PWD
环境变量。
<0.o> touch afile
<0.o> pwd
/adir
<0.o> ls $PWD/afile
/adir/afile
您可以用您自己的目录变量做同样的事情,比如说d
。
<0.o> touch afile
<0.o> d=/adir
<0.o> ls $d/afile
/adir/afile
请注意,没有标志ls <FILE>
和echo <FILE>
是等效的(对于当前目录中的文件的有效名称),因此如果您使用echo
它,您可以ls
根据需要使用。
如果情况相反,以便您拥有完整路径并想要文件名,只需使用该basename
命令。
<0.o> touch afile
<0.o> basename $PWD/afile
afile
解决方案 12:
echo $(cd $(dirname "$1") && pwd -P)/$(basename "$1")
这是对@ZeRemz 的回答的解释:
该脚本获取相对路径作为参数
"$1"
然后我们得到该路径的dirname部分(您可以将 dir 或 file 传递给该脚本):
dirname "$1"
然后我们
cd "$(dirname "$1")
进入这个相对目录&& pwd -P
并获取它的绝对路径。-P
选项将避免所有符号链接之后我们将basename附加到绝对路径:
$(basename "$1")
作为最后
echo
一步
解决方案 13:
你可以使用这个函数。如果给出的文件名没有相对路径,则假定它存在于当前工作目录中:
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
解决方案 14:
我很惊讶没有人提到位置。
如果您已经locate
安装了该软件包,您甚至不需要进入包含感兴趣文件的目录。
假设我正在寻找setenv.sh
脚本的完整路径名。这是查找方法。
$ locate setenv.sh
/home/davis/progs/devpost_aws_disaster_response/python/setenv.sh
/home/davis/progs/devpost_aws_disaster_response/webapp/setenv.sh
/home/davis/progs/eb_testy/setenv.sh
请注意,在这种情况下它会找到三个脚本,但如果我只想要一个,我会这样做:
$ locate *testy*setenv.sh
/home/davis/progs/eb_testy/setenv.sh
解决方案 15:
在类似情况下,我从其他位置启动 cshell 脚本。为了设置脚本的正确绝对路径,使其仅在指定目录中运行,我使用以下代码:
set script_dir = `pwd`/`dirname $0`
$0
存储脚本执行的确切字符串。
例如,如果脚本像这样启动:$> ../../test/test.csh
,$script_dir
将包含/home/abc/sandbox/v1/../../test
解决方案 16:
对于 Mac OS X,我替换了操作系统自带的实用程序,并将其替换为较新版本的 coreutils。这样您就可以在 Mac 上访问readlink -f
(获取文件的绝对路径)和(获取目录的绝对路径)等工具。realpath
Homebrew 版本在命令名称前面添加了一个“G”(代表 GNU Tools),因此等效的命令变成了greadlink -f FILE
和grealpath DIRECTORY
。
有关如何通过 Homebrew 在 Mac OS X 上安装 coreutils/GNU Tools 的说明,可在此 StackExchange 文章中找到。
注意:对于非 Mac Unix 用户来说,readlink -f
和realpath
命令应该是开箱即用的。
解决方案 17:
您可以将其保存在您的shell.rc
或直接放入控制台中
function absolute_path { echo "$PWD/$1"; }
alias ap="absolute_path"
例子:
ap somefile.txt
将输出
/home/user/somefile.txt
解决方案 18:
我喜欢已经给出的许多答案,但我发现这真的很有用,特别是在脚本中获取文件的完整路径,包括以下符号链接和相对引用,如.
和..
dirname `readlink -e relative/path/to/file`
这将返回从根路径开始的完整路径file
。这可以在脚本中使用它,以便脚本知道它从哪个路径运行,这对于可以位于机器上任何位置的存储库克隆很有用。
basePath=`dirname `readlink -e $0``
然后我可以${basePath}
在我的脚本中使用该变量直接引用其他脚本。
希望这能有所帮助,
戴夫
解决方案 19:
对我来说,这个方法效果很好。它不依赖于文件系统(优点和缺点取决于需求),因此速度很快;而且,它应该可以移植到大多数 *NIX 上。它确实假设传递的字符串确实与 PWD 相关,而不是其他目录。
function abspath () {
echo $1 | awk '\n # Root parent directory refs to the PWD for replacement below
/^..// { sub("^", "./") } \n # Replace the symbolic PWD refs with the absolute PWD \n /^.// { sub("^.", ENVIRON["PWD"])} \n # Print absolute paths \n /^// {print} \'
}
解决方案 20:
这很幼稚,但我必须使其符合 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}
解决方案 21:
这适用于 Linux 和 Mac OSX:
echo $(pwd)$/$(ls file.txt)
解决方案 22:
这对于文件和文件夹都有效:
getAbsolutePath(){
[[ -d $1 ]] && { cd "$1"; echo "$(pwd -P)"; } ||
{ cd "$(dirname "$1")" || exit 1; echo "$(pwd -P)/$(basename "$1")"; }
}
解决方案 23:
通常:
find `pwd` | grep <filename>
或者,仅针对当前文件夹:
find `pwd` -maxdepth 1 | grep <filename>
解决方案 24:
find / -samefile file.txt -print
将查找与 file.txt具有相同inode 号的文件的所有链接
添加-xdev
标志将避免跨越设备边界(“挂载点”)。(但如果不是从与 相同的设备上的目录开始,find
这可能会导致找不到任何内容)find
`file.txt`
请注意,find
可以为单个文件系统对象报告多个路径,因为 Inode 可以由多个目录条目链接,甚至可能使用不同的名称。例如:
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
解决方案 25:
另一个 Linux 实用程序可以完成这项工作:
fname <file>
解决方案 26:
对于 Mac OS,如果您只想获取 Finder 中文件的路径,请按住 Control 键单击文件,然后向下滚动到底部的“服务”。您会得到许多选项,包括“复制路径”和“复制完整路径”。单击其中一个选项会将路径放在剪贴板上。
解决方案 27:
fp () {
PHYS_DIR=`pwd -P`
RESULT=$PHYS_DIR/$1
echo $RESULT | pbcopy
echo $RESULT
}
将文本复制到剪贴板并在终端窗口上显示文本。
:)
(我从另一个 stack overflow 答案中复制了一些代码,但是再也找不到那个答案了)
解决方案 28:
在 Mac OSX 中,执行以下步骤:
cd
进入目标文件的目录。键入以下任一终端命令。
终端
ls "`pwd`/file.txt"
echo $(pwd)/file.txt
替换
file.txt
为您的实际文件名。按
Enter
解决方案 29:
我发现的最简单的方法是:
for i in `ls`; do echo "`pwd`/$i"; done
它对我来说很有效。
解决方案 30:
除了“readlink -f”之外,另一个常用的命令是:
$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
命令才是正确的。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件