linux文件相对路径和绝对路径


一.绝对路径与相对路径

回到顶部

在命令行下一条路径(path)有两种书写形式,一种是相对路径(relative),一种是绝对路径(absolute)。
相对路径是指相对于当前工作目录的路径,相对路径加上当前工作路径就变成了绝对路径。绝对路径总是以根目录(/)为起点。
例如当前工作目录为/home/peter,该目录下还有一个子目录叫initroot目录。用cd命令进入该目录有两种写法:
相对路径形式:cd initroot
绝对路径形式:cd /home/peter/initroot。
相对路径和绝对路径只是一个路径的不同书写形式,都是给用户看的。 相对路径是为了方便用户提高使用效率,不管是相对路径还是绝对路径,在系统内部都会变成绝对路径。
在每个目录中都有两个隐藏文件,一个是.,另一个是..。.表示当前目录,..表示上一级目录。.与..非常重要, 我们经常会用cd ..命令返回上一级目录,开发者经常使用类似./command的命令执行自己编写的命令文件或者脚本文件, 如果直接执行command命令,那么linux会去$PATH环境变量指定的路径中寻找command相对应的可执行文件, 而如果前面加上./,就是告诉shell不用那么费劲的去寻找command,它就在当前工作目录下。 最常见的就是执行自己编写的shell脚本文件了,假设你当前工作目录下的shell脚本为run.sh,只需要执行./run.sh即可执行该脚本。
绝对路径:路径的写法一定由根目录/开始,例如:/usr/share/doc目录。
绝对路径:由根目录(/)开始写起的文件名或目录名称, 例如 /home/dmtsai/.bashrc;
相对路径:相对于目前路径的文件名写法。 例如 ./home/dmtsai 或 ../../home/dmtsai/ 等等。反正开头不是 /就属于相对路径的写法
相对路径:路径的写法不是从/写起,例如从/usr/share/doc目录到/usr/share/man目录下,可以写成cd ../man,
这就是相对路径的写法!相对路径意指相对于当前工作目录的路径!
假设软件共需要三个目录,分别是etc, bin, man这三个目录,由于不同的人喜欢安装在不同的目录之下, 假设甲安装的目录是/usr/local/packages/etc, /usr/local/packages/bin及/usr/local/packages/man, 乙却喜欢安装在/home/packages/etc, /home/packages/bin, /home/packages/man这三个目录中,如果用到绝对路径的话,会很麻烦!
每个目录下的东西就很难对应起来!这个时候相对路径的写法就显的特别重要了!
此外,如果路径很长,例如/cluster/raid/output/initroot/smoke和/cluster/raid/output/initroot/cctm,
从第一个切换到第二个目录的话,怎么写比较方便? 当然是相对路径cd ../cctm比较方便!
但是对于文件名的正确性来说,绝对路径的正确度要比较好。 一般来说,如果是写程序(shell scripts)来管理系统的话,务必使用绝对路径的写法。
因为绝对路径的写法虽然比较麻烦,但是可以肯定这个写法绝对不会有问题。
如果在程序中使用相对路径,则可能由于执行的工作环境不同,导致一些问题的发生。
这个问题在工作排程(at, cron)当中尤其重要!
相对路径是以你当前所在路径的相对位置来表示的。举例来说,你目前在/home这个目录下, 如果想要进入/var/log这个目录时,可以怎么写呢?
1. cd /var/log (absolute)
2. cd ../var/log (relative)
因为你在 /home 底下,所以要回到上一层 (../) 之后,才能继续往 /var 来移动的! 特别注意两个特殊的目录:
. :代表当前的目录,也可以使用 ./ 来表示;
.. :代表上一层目录,也可以 ../ 来代表。
. 与 .. 目录概念是很重要的,常常会看到cd .. 或 ./command 之类的指令下达方式, 就是代表上一层与目前所在的目录!
如何先进入/var/spool/mail/目录,再进入到/var/spool/cron/目录内?
由于/var/spool/mail与/var/spool/cron是同样在/var/spool/目录中,因此最简单的指令下达方法为:
1. cd /var/spool/mail
2. cd ../cron
这样就不需要由根目录开始写起。这个相对路径是非常有帮助的!尤其对于某些软件开发商来说。
一般来说,软件开发商会将数据放置到/usr/local/里面的各相对目录,但如果用户想要安装到不同目录呢?就得要使用相对路径!
网络文件常常提到类似./run.sh之类的数据,这个指令的意义为何?
由于指令的执行需要变量的支持,若执行文件放置在本目录,并且本目录并非正规的执行文件目录(/bin, /usr/bin 等为正规), 此时要执行指令就得要严格指定该执行档。
./代表本目录的意思,所以./run.sh代表执行本目录下名为run.sh的文件!

二.目录树与磁盘分区的关系

回到顶部

在安装linux之前需要合理规划磁盘分区。假设我们将磁盘分为三个主分区,在windows下分别对应C盘、D盘和E盘。
而在linux下设备是以文件的形式存在的,假设磁盘设备文件为/dev/sda,那么三个主分区的设备文件分别对应为/dev/sda1、/dev/sda2和/dev/sda3。 我们在windows下可以很容易的访问磁盘分区,一般访问路径为C:\dir、D:\dir、E:\dir。那么在linux下该如何访问这三个磁盘分区呢? 在linux下,我们也是以目录路径的形式访问磁盘分区,但是和windows不同的是,linux目录是以根目录/为起点的树状结构,称为目录树。
在访问磁盘分区之前需要先将磁盘分区挂到这棵树上,称为挂载。而可以挂载设备的目录称为挂载点
通过mount命令我们可以将/dev/sda1挂载到/根目录下,/dev/sda2挂载到/home目录下,/dev/sda3挂载到/boot目录下:
mount /dev/sda1 /
mount /dev/sda2 /home
mount /dev/sda3 /boot
这样我们访问根目录就相当于访问windows下的C盘,访问/home目录就相当于访问D盘,访问/boot目录就相当于访问E盘。
通过lsblk命令可以观察磁盘分区和挂载点分配情况。
这里需要注意不是所有目录都适合作为挂载点使用的,比如根目录下的/etc、/bin、/dev、/lib、/sbin,这些目录都不能作为挂载点使用,需要和/根目录放在同一个分区中。
当然我们不能每次都通过mount命令手动挂载设备,况且根目录必须在linux启动的时候就挂载好。
正确的做法是将磁盘分区和挂载点信息写到/etc/fstab配置文件中,这样每次linux启动的时候就会自动挂载磁盘分区了。 根目录因为在系统启动的时候就必须挂载,所以/etc/fstab文件中必须有根目录的挂载信息。 在安装linux的时候,安装程序会要求我们对磁盘进行分区和分配挂载点,所以最好在安装linux之前,就根据实际情况合理规划好磁盘分区和挂载点分配。

initroot编辑整理,转载请注明www.initroot.com

100次点赞 100次阅读