浏览文件系统

2021/8/25 6:07:20

本文主要是介绍浏览文件系统,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

image

当登录系统并获得shell命令提示符后,你通常位于自己的主目录中。

我一登录进去是这样的,第一行是登录时间,第二行是一个类似IP地址的东西,但是是哪里的IP地址,暂时不知道,最后是第三行,我搜索一下我之前的笔记,root是用户ID,huangzihan是系统名,#是bash shell提示符,然后#提示符之前应该是目录名,代码如下:

Last login: Sun May  2 12:10:32 2021 from 113.116.156.243
root@huangzihan:~#

文件系统

Windows的文件系统

你将注意到的第一个不同点是,Linux在路径名中不使用驱动器盘符。在Windows中,PC上安装的物理驱动器决定了文件的路径名。Windows会为每个物理驱动词驱动盘分配一个盘符,每个驱动器都会有自己的目录结构,以便访问存储其中的文件。

当我们双击点开我的电脑或者此电脑,可以看到设备和驱动器下有一个个命名为C、D、E、F的磁盘(物理驱动器),而这些C、D、E、F就是磁盘的符号。

举个例子在,Windows中经常看到这样的文件路径:

D:\linux-0.01内核\.git\hooks\update.sample

这种Windows文件路径表明了文件update.sample究竟位于哪个磁盘分区中,这里我们可以看出这个文件位于我们的D盘。

如果你将test.doc保存在闪存上,该闪存由J来标识那么文件的路径就是J:\test.doc。该路径表明文件位于J盘的根目录下。

Linux的文件系统

虚拟目录

Linux则采用了一种不同的方式。Linux将文件存储在单个目录结构中,这个目录被称为虚拟目录(virtual directory)

根目录

Linux虚拟目录结构只包含一个称为根(root)目录的基础目录。根目录下的目录和文件会按照访问它们的目录路径一一列出,这点跟Windows类似。

窍门:你将会发现Linux使用正斜线(/)而不是反斜线(\)在文件路径中划分目录。在Linux中,反斜线用来标识转义字符,要是用在文件路径中的话会导致各种各样的问题。

现在我们要进入这条路径/sys/kernel/debug/usb/ehci,操作代码如下:

root@huangzihan:/# ls -a
.   bin   dev  home  lib32  libx32      media  opt   root  sbin  swapfile  tmp  var
..  boot  etc  lib   lib64  lost+found  mnt    proc  run   srv   sys       usr
root@huangzihan:/# cd sys/
root@huangzihan:/sys# ls -a
.  ..  block  bus  class  dev  devices  firmware  fs  hypervisor  kernel  module  power
root@huangzihan:/sys# cd kernel/
root@huangzihan:/sys/kernel# ls -a
.            cgroup  fscaps        kexec_crash_loaded  livepatch  profiling      security        tracing        vmcoreinfo
..           config  iommu_groups  kexec_crash_size    mm         rcu_expedited  slab            uevent_helper
boot_params  debug   irq           kexec_loaded        notes      rcu_normal     software_nodes  uevent_seqnum
root@huangzihan:/sys/kernel# cd ..
root@huangzihan:/sys# cd kernel/
root@huangzihan:/sys/kernel# cd debug/
root@huangzihan:/sys/kernel/debug# ls -a
.      cleancache        dri                 gpio            opp       regmap          split_huge_pages  virtio-ports
..     clear_warn_once   dynamic_debug       hid             pinctrl   regulator       suspend_stats     wakeup_sources
acpi   clk               error_injection     iosf_sb         pm_genpd  remoteproc      swiotlb           x86
bdi    device_component  extfrag             kprobes         pm_qos    sched_debug     sync              zswap
block  devices_deferred  fault_around_bytes  mce             pwm       sched_features  tracing
cec    dma_buf           frontswap           memcg_slabinfo  ras       sleep_time      usb
root@huangzihan:/sys/kernel/debug# cd usb/
root@huangzihan:/sys/kernel/debug/usb# ls -a
.  ..  devices  ehci  ohci  uhci  xhci
root@huangzihan:/sys/kernel/debug/usb# cd ehci/
root@huangzihan:/sys/kernel/debug/usb/ehci# ls -a
.  ..
root@huangzihan:/sys/kernel/debug/usb/ehci#

我们沿着这条路径一直cd进去,最后到了ehci,在这个目录下是没有文件的,sys的下一级目录是kernel,kernel的下一级目录是debug,debug的下一级目录是usb,usb下一级目录是ehci。

路径本身并没有提供任何有关文件究竟存放在哪个物理磁盘上的信息。

这个和Windows的相比较就知道了,Windows的路径最前面会有一个盘符,而Linux的路径就没有,而是一个/

挂载点

Linux会在根驱动器上创建一些特别的目录,我们称之为挂载点(mount point)。挂载点是虚拟目录中用于分配额外存储设备的目录。虚拟目录会让文件和目录出现在这些挂载点目录中,然后而实际上它们却存储在另外一个驱动器中。

通常系统文件会存储在根目录中,而用户文件则存储在另一个驱动器,如下图:

Linux文件结构

文件结构展示了计算机中的两块硬盘。一块硬盘和虚拟目录的根目录(由正斜线/表示)关联起来。剩下的硬盘就可以挂载到虚拟目录结构中的任何地方。在这个例子中,第二块硬盘被挂载到了/home位置,用户目录都位于这个位置。

常见的Linux目录名称
目录 用途
/ 虚拟目录的根目录。通常不会在这里存储文件
/bin 二进制目录,存放许多用户级的GNU工具
/boot 启动目录,存放启动文件
/dev 设备目录,Linux在这里创建设备节点
/etc 系统配置文件目录
/home 主目录,Linux在这里创建用户目录
/lib 库目录,存放系统和应用程序的库文件
/media 媒体目录,可移动媒体设备的常用挂载点
/mnt 挂载目录,另一个可移动媒体设备的常用挂载点
/opt 可选目录,常用于存放第三方软件包和数据文件
/proc 进程目录
/root root用户的主目录
/sbin 系统二进制目录,存放许多GNU管理员级工具
/run 运行目录,存放系统运行时的运行的数据
/srv 服务目录,存放本地服务的相关文件
/sys 系统目录,存放系统硬件信息的相关文件
/tmp 临时目录,可以在该目录中创建和删除临时工作文件
/usr 用户二进制目录,大量用户级的GNU工具和数据文件都存储在这里
/var 可变目录,用以存放经常变化的文件,比如日志文件

我使用了ls -a这条指令查看了我云服务器上的Ubuntu系统的根目录下有哪些目录,代码如下:

root@huangzihan:/# ls -a
.   bin   dev  home  lib32  libx32      media  opt   root  sbin  swapfile  tmp  var
..  boot  etc  lib   lib64  lost+found  mnt    proc  run   srv   sys       usr

再对比一下,我这个版本Ubuntu系统和上面表格上,多出了:

  • lib32
  • lib64
  • lost+found
  • libx32
  • swapfile

文件系统层级标准(FHS)

常见的目录名均基于文件系统层级标准(filesystem hierarchy standard,FHS)。FHS官方主页:http://www.pathname.com/fhs

在登陆系统并获得一个shell CLI提示符后,会话将从主目录开始。主目录是分配给用户账户的一个特有目录。用户账户在创建之后,系统通常会为其分配一个特有的目录。

可以使用图形界面在虚拟目录中跳转。想要在CLI提示符下切换虚拟目录,需要使用cd命令。

遍历目录

cd命令

在Linux文件系统上,可以使用切换目录命令cd将shell会话切换到另一个目录。

cd命令可接受单个参数destination,用以指定想切换到的目录名。如果没有为cd命令指定目标路径,它将切换到用户主目录。

destination参数可以用两种方式表示:一种是使用绝对文件路径,另一种是使用相对文件路径。

绝对文件路径

用户可在虚拟目录中采用绝对文件路径引用目录名。绝对文件路径定义了在虚拟目录结构中该目录的确切位置,以虚拟目录的根目录开始,相当于目录的全名。

绝对文件路径总是以正斜线(/)作为起始,指明虚拟文件系统的根目录。因此,如果要指向usr目录所包含的bin目录下的用户二进制文件,可以使用如下绝对文件路径:

/usr/bin

使用绝对文件路径可以清晰表明用户想切换到的确切位置。要用绝对文件路径来切换文件系统中的某个特定位置,只需在cd命令后指定全路径名:

根据上面说的,如果我们知道我们要找的目录或者文件的路径,就可以直接cd到该路径下,所以下面两种方法等效的:

root@huangzihan:/# ls -a
.   bin   dev  home  lib32  libx32      media  opt   root  sbin  swapfile  tmp  var
..  boot  etc  lib   lib64  lost+found  mnt    proc  run   srv   sys       usr
root@huangzihan:/#
root@huangzihan:/# cd usr
root@huangzihan:/usr# ls -a
.  ..  bin  games  include  lib  lib32  lib64  libx32  local  sbin  share  src
root@huangzihan:/usr# cd bin/
root@huangzihan:/usr/bin# ls -a
 .                                    dpkg-shlibdeps          m4                                 setleds
 ..                                   dpkg-source             mail                               setlogcons
'['                                   dpkg-split              mail.mailutils                     setmetamode
...
...
...
root@huangzihan:/# cd /usr/bin
root@huangzihan:/usr/bin# ls -a
 .                                    dpkg-shlibdeps          m4                                 setleds
 ..                                   dpkg-source             mail                               setlogcons
'['                                   dpkg-split              mail.mailutils                     setmetamode
...
...
...

提示符中一开始有一个波浪号(~)。在切换到另一个目录之后,这个波浪号被/usr/bin替代了。CLI提示符正是用它来帮助你跟踪当前所在虚拟目录结构中的位置。波浪号表明shell会话位于你的主目录中。在切换出主目录之后,如果提示符已经进行了相关配置的话,绝对文件路径就会显示在提示符中。

在我这里提示符是#,当我打开控制台终端的那一刻,进入的是主目录,这时候#之前是波浪号~;当我切换cd到根目录的时候,#之前的是正斜线(/),再cd到绝对路径usr/bin/,提示符之前就是绝对路径usr/bin/

Last login: Sun May  2 17:17:22 2021 from 113.116.156.243
root@huangzihan:~# ls -a
.  ..  .bash_history  .bashrc  .cache  .pip  .profile  .pydistutils.cfg  .ssh  .viminfo  .Xauthority
root@huangzihan:~# cd ..
root@huangzihan:/# cd usr/bin/
root@huangzihan:/usr/bin#
pwd命令和当前目录

如果没有配置好提示符来显示当前shell会话的绝对文件路径,也可以使用shell命令来显示所处的位置。pwd命令可以显示出shell会话的当前目录,这个目录被称为当前工作目录。

root@huangzihan:/# ls -a
.   bin   dev  home  lib32  libx32      media  opt   root  sbin  swapfile  tmp  var
..  boot  etc  lib   lib64  lost+found  mnt    proc  run   srv   sys       usr
root@huangzihan:/# pwd
/
root@huangzihan:/# ls -a
.   bin   dev  home  lib32  libx32      media  opt   root  sbin  swapfile  tmp  var
..  boot  etc  lib   lib64  lost+found  mnt    proc  run   srv   sys       usr
root@huangzihan:/# cd run
root@huangzihan:/run# ls -a
.              atd.pid  chronyd.pid    crond.pid     initctl    log           NetworkManager   shm       sudo        udev  uuidd
..             blkid    cloud-init     crond.reboot  initramfs  motd.dynamic  resolvconf       sshd      systemd     user
agetty.reload  chrony   console-setup  dbus          lock       mount         sendsigs.omit.d  sshd.pid  tmpfiles.d  utmp
root@huangzihan:/run# pwd
/run
root@huangzihan:/run# cd log
root@huangzihan:/run/log# pwd
/run/log
root@huangzihan:/run/log#

根据上面这段代码,我们不难发现,当我们使用pwd命令查看当前目录的时候,所显示出来的目录和提示符#之前的路径是一致的。

窍门:在切换到新的当前目录时使用pwd命令,是很好的习惯。因为很多shell命令都是在当前工作目录中操作的,在发出命令之前,你应该始终确保自己处在正确的目录中。

root@huangzihan:/run/log# cd
root@huangzihan:~# cd /run/log
root@huangzihan:/run/log#

这上面一段代码告诉我们,我们可以使用cd 绝对路径到我们想要的位置,也可以使用cd直接返回到主目录。



这篇关于浏览文件系统的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程