Linux 目录与文件

内容来自实验楼

Linux 文件系统
文件系统介绍

Linux 文件系统作为一个系统不仅包含了文件中的数据而且还有文件系统的这样的结构。且文件系统中的文件是数据的一个集合,所有 Linux 用户和程序看到的 文件目录软连接文件保护信息 等都存储在其中。

Linux 主要采用的是树形结构,与 windows 不同(每个分区都是一棵文件树,根节点为盘符),它是单一的一棵树,无论有多少分区,都包含在以 / 为根节点的树结构上。其中分区是物理上的区分,目录则是逻辑上的区分。Linux 中每个分区都要挂载到目录树中一个具体的目录下才能访问,其中根目录必须挂载一个分区。 对于挂载就是 Linux 文件系统与一个存储设备关联起来的过程(后面会着重介绍)。 因为 Linux 是一个多用户系统,一个规范的目录有助于对系统文件和不同的用户文件进行统一管理。

文件系统组成
  • 名字空间:主要给事物对象命名,并按照一种层次结构来组织

  • API(应用编程接口):主要用于查询和操作对象的一种系统调用

  • 安全模型:主要用于保护、共享和隐藏对象

  • 实现:主要用于逻辑模型和硬件系统连接起来

Linux 目录结构
路径

Linux 的目录结构是树状结构,最顶级的目录为根目录 /。而其他目录可以通过挂载将它们添加到树中,通过解除挂载移除。所以在开始之前,我们先来了解一些什么是绝对路径相对路径

在 Linux 实验环境操作中,我们是通过 cd 命令来切换路径, . 表示当前目录,.. 表示上一级目录, - 表示上一次所在目录, 通常表示当前用户的 home 目录。

  • 绝对路径

    在 Linux 中,绝对路径是从 /(也被称为根目录)开始的完整路径,比如:/usr/etc/X11

  • 相对路径

    相对路径是以 ... 开始的,表示用户当前操作所处的位置,而 .. 表示上级目录,表示用户当前所处的目录。

文件树

linux 中,无论操作系统管理几个磁盘分区,这样的目录树只有一个。从结构上讲,各个磁盘分区上的树型目录不一定是并列的。

在 Linux 的目录结构中,用户的主目录通常是保存在一个单独的文件系统上,然后挂载到根目录下的一个目录。而想这样的文件系统布局都是遵守了文件系统层次结构标准(FHS,Filesystem Hierarchy Standard)。FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

FHS 标准定义了两层规范:

第一层是: / 下面的各个目录应该放什么文件数据,例如 /etc 应放置配置文件,/bin/sbin 则应该放置可执行文件等。

第二层是:针对 /usr/var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件,/usr/share 放置共享数据等等。

Linux 文件属性

首先,我们先用命令 ls -al来查看一下文件的详细信息

从屏幕打印出来的信息我们可以知道,从左到右依次表示:文件类型和权限、硬链接数、所有者、所属组、文件大小、最后修改时间、文件名。 还有一个比较重要的概念就是Linux 里面一切皆文件

文件类型
  • 普通文件 -

    文本文件、数据文件、可执行程序等等都可作为普通文件存储。

  • 目录 d

    目录中按照名字来对其他文件进行引用,用户通过 mkdir 创建目录,用 rmdir 来删除空目录,用 rm -r 来删除非空目录。

  • 字符设备文件 c

    字符设备文件让相关的驱动程序作为输入输出的缓冲。

  • 块设备文件 b

    块设备文件有处理块数据的 I/O 的驱动程序使用,同时让内核提供缓冲。

  • 本地域套接口 s

    实现进程间通信的连接,本地域套接口由系统调用 socket 创建,用 rmunlink 删除。

  • 有名管道(FIFO)p

    让运行在同一主机上的两个进程相互通信,和 socket 相似,用 mknod 创建,用 rm 来删除。

  • 符号链接 l

    也叫做 软链接,通过名字指向文件。用 ln -s 创建,用 rm 来删除。

文件权限

接下来的字符,以三个为一组,且均为 rwx 的三个参数的组合,代表了 Linux 的读、写、执行三种权限控制。(r 代表可读(read)、w 代表可写(write)、x 代表可执行(execute),要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 -。) 其中三位一组分别是所有者的权限(U,即 user)所属组的权限(G,即 group)其他用户的权限(O,即 other)

  • 权限编码

    数字字符文件/目录
    4r查看文件内容/查看目录下的文件或目录名称
    2w修改文件内容/在目录下增删改
    1x执行一些程序或脚本/可以用命令切换目录
    八进制二进制权限
    0000
    1001–x
    2010-w-
    3011-wx
    4100r–
    5101r-x
    6110rw-
    7111rwx
  • chmod:改变文件或目录权限

    chmod [选项][权限][文件或目录]
    

    选项说明:

    –reference=RFILE :根据参考文档设置权限

    -R :递归的将权限应用于所有的子目录和子文件

  • 修改权限的 3 种形式

    我们首先通过 ls -l命令来查看一下 install.log 的文件,然后用 chmod 命令的三种不同的形式来修改文件所有者权、所属组权限和其他人权限。

    $ touch install.log
    $ ls -l install.log
    -rw-rw-r-- 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
    
    • 使用字符形式修改权限

    chmod 命令参数中,u 代表所有者,g 代表所属组,o 代表其他用户,a 代表所有人。

    修改 install.log 文件的权限设置成全部为可读、可写、可执行。

    $ sudo chmod u=rwx,g=rwx,o=rwx install.log
    $ ls -l install.log
    
    -rwxrwxrwx 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
    
    $ sudo chmod a=rw install.log
    $ ls -l install.log
    
    -rw-rw-rw- 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
    
    • 使用操作符形式修改权限

    操作符形式是在字符形式的基础上来对文件或目录使用 +/- 操作符来设置权限。 通过 + 符号增加相应的权限,- 符号减去相应的权限。

    $ chmod u+x,g+x,o-rw install.log
    $ ls -l install.log
    
    -rwxrwx--- 1 shiyanlou shiyanlou 0 10月 30 13:43 install.log
    
    • 使用数字形式修改权限
    $ chmod 777 install.log    # 修改文件权限为 `rwxrwxrwx`
    $ chmod 700 install.log    # 修改文件权限为 `rwx------`
    $ sudo chmod 755 /home     # 修改目录权限为 `rwxr-xr-x`
    
  • chown:改变归属关系

    chown 命令主要用于改变属主的所有权,语法和 chmod 类似。

    $ mkdir test
    $ ls -l 
    $ sudo chown root test   # 修改文件的所属者为 `root`,因为是超级用户所以需要用到 `sudo`。
    $ ls -l
    drwxrwxr-x 2 root      shiyanlou 4096 1030 13:52 test
    
  • chgrp:改变归属组

    chgrp 命令是改变文件或目录的属组的所有权,语法和 chmod 类似。

    $ sudo chgrp root test 
    $ ls -l
    
    drwxrwxr-x 2 root      root      4096 10月 30 13:52 test
    

补充:

chown 可以一次同时改变所属者和所属组。

$ sudo chown shiyanlou:shiyanlou test
$ ls -l 

drwxrwxr-x 2 shiyanlou shiyanlou 4096 10月 30 13:52 test
  • umask:默认权限

    umask 主要用来设置用户创建文件的默认权限,它与 chmod 的效果刚好相反,umask 设置的是权限“补码”,而 chmod 设置的是文件权限码。一般在 /etc/profile$[HOME]/.bash_profile$[HOME]/.profile 中设置 umask 值。

    那么如何计算 umask 值相应的文件和目录缺省创建权限是多少呢?

    具体步骤如下:

      第一步,先写下具有全部权限的模式,即 777 (所有用户都具有读、写和执行权限)。

      第二步,在下面一行按照 umask 值写下相应的位。

      第三步,在接下来的一行中记下上面两行中没有匹配的位。这就是目录的缺省创建权限。

      第四步,而对于文件来说,在创建时不能具有执行权限,只要拿掉相应的执行权限即可。

    eg:我们来做个练习,假设 umask 值为 022

    (1)文件的最大权限是: rwx rwx rwx (777)

    (2)umask 值为 022 (— -w- -w-)

    (3)目录权限就是 rwx r-x r-x (755) (这就是目录创建缺省权限)

    (4)文件权限 rw- r– r– (644) (这就是文件创建缺省权限)

linux 文件操作
查看文件
  • ls 命令

    在这之前我们已经多次接触了这个命令,如你所见,他的主要作用就是用来显示当前目录下的文件信息,当然在带参数的情况下,他就能用来查看文件权限或者其他更为详细的信息。

    长格式来显示文档的详细信息。(包括文件的类型和权限、硬链接数、所有者、所属组、文件大小、最后修改时间和文件名

    $ ls -l  
    

    显示所有,包括隐藏文件和目录

    $ ls -a 
    
  • cat 命令

    用来查看文件的内容

    查看文件 /etc/passwd,参数 -n 表示显示行号,包括空白行。

    $ cat -n /etc/passwd  
    
  • tac 命令

    用来打印文件内容到标准输出(终端),和 cat 正好相反,为倒序显示。

    $ tac /etc/passwd 
    
  • more & less 命令

这两个命令都是分页查看文件内容,通过空格键查看下一页,q 键退出,不过 less 还可以通过方向键来上下回翻。不过和前面的 cat 相比这两个命令更像是一个用来阅读文件内容的。

$ more /etc/passwd
$ less /etc/passwd
  • grep 命令

    查找关键词并打印匹配的行。

    在 /etc/passwd 文件中过滤出包含 sh 的行。

    $ grep sh /etc/passwd
    
  • head & tail 命令

    head

    用于显示文件的开头的内容。在默认情况下,head 命令显示文件的前 10 行内容。

    语法

    head [选项][参数]
    
    选项说明
    -n<数字>指定显示头部内容的行数
    -c<字符数>指定显示头部内容的字符数
    -v总是显示文件名的头信息
    -q不显示文件名的头信息

    eg:显示前 3 行内容

    head -3 /etc/passwd
    

    tail

    用于输入文件中的尾部内容,tail 命令默认在屏幕上显示指定文件的末尾 10 行。

    语法

    tail [-nkcvq][file]
    

    eg:显示末尾 3 行内容

    tail -3 /etc/passwd
    
操作文件
  • touch 命令

    用来创建空白文件,也可以用来更改已有文件的时间戳。

    $ touch hello.txt
    
  • mkdir 命令

    用于创建一个空目录,也可指定创建目录的权限属性。

    $ mkdir world
    $ mkdir -p /home/shiyanlou/hello/shi/yan/lou  # 创建多级目录/hello/shi/yan/lou
    
  • cp 命令

    用于复制文件和目录

    将之前创建的 hello.txt 文件复制到 /home/shiyanlou/hello/shi/yan/lou目录中。

    $ cp hello.txt /home/shiyanlou/hello/shi/yan/lou
    

    直接复制目录的时候会出现一些错误,所以需要加上 -r-R 参数,表示递归复制。

    $ cp -r world test
    
  • rm 命令

    用于删除文件或目录

    删除文件 hello.txt

    $ rm hello.txt
    

    有时使用删除命令时,会出现一些提示,若想忽略不提示,则使用参数 -f 来强制删除。

    $ touch hello.txt
    $ chmod 444 hello.txt
    $ rm hello.txt
    $ rm -f hello.txt
    

    删除目录和复制的操作相似,都需要加上 -r-R 参数

    $ rm -r world
    
  • mv 命令

    移动或者重命名文件或目录

    $ mkdir doc
    $ touch file1
    $ mv file1 doc
    

    重命名文件

    $ mv file1 file2
    
  • du 命令

    用于计算文件或目录的容量

    查看 /home 目录及子目录的容量信息

    $ du /home
    

    使用参数 -s 查看 /root 所占磁盘的空间总和

    $ sudo du -s /home
    
  • stat 命令

    查看文件的状态

    $ stat /home/shiyanlou/doc/file2
    

链接文件

在 Linux 中链接文件可以分为软链接硬链接两种。

创建方法:

  • 软链接(符号链接) :ln -s source target

    软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

    $ touch test.log            # 创建一个测试文件 test.log
    $ ln -s test.log  test1.log  # 创建 test.log 的一个软链接文件 test1.log
    
  • 硬链接 (实体链接):ln source target

    硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode)。在 Linux 中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。

    $ ln test.log test2.log     # 创建 file 的一个硬链接文件 test2.log
    $ ls -li                    # 参数 `-i` 显示出文件的节点信息 
    
    ... 
    277972 lrwxrwxrwx 1 shiyanlou shiyanlou    8 10月 30 14:19 test1.log -> test.log
    277971 -rw-rw-r-- 2 shiyanlou shiyanlou    0 10月 30 14:19 test2.log
    277971 -rw-rw-r-- 2 shiyanlou shiyanlou    0 10月 30 14:19 test.log
    
  • 两种链接的区别

    硬链接文件有两个限制:

    1. 不允许给目录创建硬链接;   

    2. 只有在同一文件系统中的文件之间才能创建链接,而且只有超级用户才有建立硬链接权限。

    软链接没有硬链接以上的两个限制,因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。但是软链接的缺点在于:因为链接文件包含有原文件的路径信息,所以当原文件从一个目录下移到其他目录中,再访问链接文件,系统就找不到了,而硬链接就没有这个缺陷,你想怎么移就怎么移。还有它要系统分配额外的空间用于建立新的索引节点和保存原文件的路径。

    软链接可以跨分区,但源文件不能删除,硬链接不能跨分区,但可以删除源文件。