5 文件与目录管理

5.1 处理目录的常用命令

  • 可以使用man 命令来查看各个命令的使用文档,如man cp
命令 功能
ls 列出目录
cd 切换目录
pwd 显示目前的目录
mkdir 创建一个新的目录
rmdir 删除一个空的目录
cp 复制文件或目录
rm 移除文件或目录
mv 移动文件与目录,或修改文件与目录的名称

5.1.1 ls 列出目录

  • 语法
    • ls [-aAdfFhilnrRSt] 目录名称
    • ls [--color={never,auto,always}] 目录名称
    • ls [--full-time] 目录名称
  • 选项与参数
选项 功能
-a 显示全部文件,包括隐藏文件(开头为 . 的文件),是最常用的选项之一
-A 显示全部文件,连同隐藏文件,但不包括 . 与 ..
-d 仅列出目录本身,不列出目录内的文件数据
-f ls 默认会以文件名排序,使用 -f 会直接列出结果,不进行排序
-F 在文件或目录名后加上文件类型的指示符号,例如,* 代表可运行文件,/ 代表目录,= 代表 socket 文件,
-h 以易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等
-i 显示 inode 节点信息
-l 使用长格式列出文件和目录信息,包含文件的属性与权限等数据
-n 以 UID 和 GID 分别代替文件用户名和群组名显示
-r 将排序结果反向输出,比如若原本文件名由小到大,反向则为由大到小
-R 连同子目录内容一起列出来,等于将该目录下的所有文件都显示出来
-S 以文件容量大小排序
-t 以时间排序
–color=never 不依据文件特性给予颜色显示
–color=always 表示显示颜色,ls 默认采用这种方式
–color=auto 表示让系统自行依据配置来判断是否给予颜色
–full-time 以完整时间模式(包含年、月、日、时、分)输出
–time={atime,ctime} 输出访问时间或改变权限属性时间(ctime),而不是内容变更时间
# 将主目录下的所有文件列出来(含属性与隐藏文件)
ls -al ~

5.1.2 cd 切换目录

  • cd(Change Directory):用来变换工作目录
  • 语法 cd [相对路径或绝对路径]

    # 回到自己的主目录,对于 root 用户,其主目录为 /root
    [root@localhost vbird]# cd ~
    # 没有加上任何路径,代表回到当前登录用户的主目录
    [root@localhost ~]# cd
    # 切换到 vbird 这个用户的主目录,即 /home/vbird
    [root@localhost ~]# cd ~vbird
    # 切换到目前的上一级目录,即 /root 的上一级目录
    # 需要注意,在 Linux 系统中,根目录存在 .(当前目录)以及 ..(当前目录的父目录)两个目录
    # 但由于根目录是最顶级目录,因此根目录的 .. 和 . 属性和权限完全一致,即根目录的父目录是自身
    [root@localhost ~]# cd ..
    # 回到上次所在目录
    [root@localhost /]# cd -
    

5.1.3 pwd 显示当前目录

  • pwd(Print Working Directory):显示当前所在目录(链接路径)
  • 语法 pwd [-P]
  • 选项与参数

    • -P :显示出实际路径,而非使用链接(link)路径

      # 确定当前登陆的用户
      [root@www ~]# whoami
      root
      # 显示出目录
      [root@www ~]# pwd
      /root
      # /var/mail是一个链接文件
      [root@www ~]# cd /var/mail
      # 列出目前的工作目录
      [root@www mail]# pwd
      /var/mail
      [root@www mail]# pwd -P
      # /var/spool/mail
      [root@www mail]# ls -ld /var/mail
      lrwxrwxrwx 1 root root 10 Sep  4 17:54 /var/mail -> spool/mail
      # /var/mail 链接到 /var/spool/mail
      # 加上 -P 选项后,会不以链接文件的数据显示,而是显示正确的完整路径
      

5.1.4 mkdir 创建新目录

  • 语法 mkdir [-mp] 目录名称
  • 选项与参数

    • -m:配置文件的权限,直接配置,不需要看默认权限(umask)
    • -p:直接递归创建目录(包含上一级目录)

      [root@www ~]# cd /tmp
      # 创建一名为 test 的新目录
      [root@www tmp]# mkdir test
      # 没办法直接创建此目录
      [root@www tmp]# mkdir test1/test2/test3/test4
      # mkdir: cannot create directory `test1/test2/test3/test4':
      # No such file or directory
      # 加 -p 选项可以自行创建多层目录
      [root@www tmp]# mkdir -p test1/test2/test3/test4
      # 如果没有加上 -m 来强制配置属性,系统会使用默认属性。
      [root@www tmp]# mkdir -m 711 test2
      [root@www tmp]# ls -l
      drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
      drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
      drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
      

5.1.5 rmdir 删除空的目录

  • 语法 rmdir [-p] 目录名称
  • 选项与参数

    • -p:递归删除空目录

      #删除 runoob 目录
      [root@www tmp]# rmdir runoob/
      # 将 mkdir 实例中创建的目录(/tmp 底下)删除掉
      [root@www tmp]# ls -l
      drwxr-xr-x  3 root  root 4096 Jul 18 12:50 test
      drwxr-xr-x  3 root  root 4096 Jul 18 12:53 test1
      drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
      [root@www tmp]# rmdir test
      # 因为尚有内容,所以无法删除
      [root@www tmp]# rmdir test1
      # rmdir: `test1': Directory not empty
      # 利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除
      [root@www tmp]# rmdir -p test1/test2/test3/test4
      [root@www tmp]# ls -l        <==您看看,底下的输出中test与test1不见了!
      drwx--x--x  2 root  root 4096 Jul 18 12:54 test2
      
  • 要注意 rmdir 仅能删除空的目录,可以使用 rm 命令来删除非空目录

5.1.6 cp 复制文件或目录

  • 语法
    • cp [-adfilprsu] 源文件(source) 目标文件(destination)
    • cp [options] source1 source2 source3 .... directory
  • 选项与参数

    • -a:等同于 -pdr
    • -d:若源文件为链接文件(link file),则复制链接文件属性而非文件本身
    • -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次
    • -i:若目标文件(destination)已经存在,在覆盖时会先询问动作
    • -l:进行硬式连结(hard link)的链接文件创建,而非复制文件本身
    • -p:连同文件的属性(所有者、所属组和时间等)一起复制,而非使用默认属性(备份常用)
    • -r:递归复制,用于复制目录
    • -s:复制成为符号链接文件(symbolic link)
    • -u:destination 比 source 旧才更新(update) destination

      # 用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc
      [root@www ~]# cp ~/.bashrc /tmp/bashrc
      [root@www ~]# cp -i ~/.bashrc /tmp/bashrc
      # cp: overwrite `/tmp/bashrc'? n  <==n不覆盖,y为覆盖
      

5.1.7 rm 移除文件或目录

  • 语法 rm [-fir] 文件或目录
  • 选项与参数

    • -f:force,忽略不存在的文件,不会出现警告信息
    • -i:互动模式,在删除前会询问使用者是否动作
    • -r:递归删除

      # 删除创建的 bashrc
      [root@www tmp]# rm -i bashrc
      # rm: remove regular file `bashrc'? y
      # 如果加上 -i 就会主动询问
      

5.1.8 mv 移动文件与目录,或修改名称

  • 语法
    • mv [-finuv] source destination
    • mv [options] source1 source2 source3 .... directory
  • 选项与参数

    • -f:force 强制,如果目标文件已经存在,不会询问而直接覆盖
    • -i:若目标文件 (destination) 已经存在,就会询问是否覆盖,默认选项
    • -n:若目标文件已经存在,则不会覆盖移动,且不会询问用户
    • -u:若目标文件已经存在,且 source 比较新,才会更新(update)
    • -v:显示文件或目录的移动过程

      # 复制一文件,创建一目录,将文件移动到目录中
      [root@www ~]# cd /tmp
      [root@www tmp]# cp ~/.bashrc bashrc
      [root@www tmp]# mkdir mvtest
      [root@www tmp]# mv bashrc mvtest
      # 将刚刚的目录名称更名为 mvtest2
      [root@www tmp]# mv mvtest mvtest2
      

5.1.9 touch 创建文件及修改文件时间戳

  • 语法
    • touch [options] 文件名
  • 选项与参数
    • -a:只修改文件的访问时间
    • -c:仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件
    • -d:后面可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间
    • -m:只修改文件的数据修改时间
    • -t:命令后面可以跟欲修订的时间,而不用目前的时间,时间书写格式为 YYMMDDhhmm
  • touch 命令可以只修改文件的 atime,也可以只修改文件的数据 mtime,但是不能只修改文件的 ctime。因为,不论是修改访问时间,还是修改文件的数据时间,对文件来讲,状态都会发生改变,即 ctime 会随之改变(更新为操作当前文件的真正时间)

    # 建立名为 bols 的空文件
    [root@www ~]# touch bols
    # 查看文件的访问时间
    [root@www ~]# ll --time=atime bols
    # 文件上次的访问时间为 9 月 25 号 21:23
    -rw-r--r-- 1 root root 0 Sep 25 21:23 bols
    [root@localhost ~]# touch bols
    [root@localhost ~]# ll --time=atime bols
    -rw-r--r-- 1 root root 0 May 15 16:36 bols
    # 而如果文件已经存在,则也不会报错,只是会修改文件的访问时间
    # 修改 bols 文件的 atime 和 mtime
    [root@localhost ~]# touch -d "2017-05-04 15:44" bols
    [root@localhost ~]# ll bols; ll --time=atime bols; ll --time=ctime bols
    -rw-r--r-- 1 root root 0 May 4 2017 bols
    -rw-r--r-- 1 root root 0 May 4 2017 bols
    -rw-r--r-- 1 root root 0 Sep 25 21:40 bols
    # ctime 不会变为设定时间,但更新为当前服务器的时间
    

5.1.10 ln 在文件之间建立链接(硬链接和软链接)

  • Linux 系统中,每个文件主要拥有 3 个时间参数(通过 stat 命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间
    • 访问时间(Access Time, atime):只要文件的内容被读取,访问时间就会更新。例如,使用 cat 命令可以查看文件的内容,此时文件的访问时间就会发生改变
    • 数据修改时间(Modify Time, mtime):当文件的内容数据发生改变,此文件的数据修改时间就会跟着相应改变
    • 状态修改时间(Change Time, ctime):当文件的状态发生变化,就会相应改变这个时间。比如,如果文件的权限或者属性发生改变,此时间就会相应改变
  • 语法
    • touch [options] 文件名
  • 选项与参数
    • -a:只修改文件的访问时间
    • -c:仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件
    • -d:后面可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间
    • -m:只修改文件的数据修改时间
    • -t:命令后面可以跟欲修订的时间,而不用目前的时间,时间书写格式为 YYMMDDhhmm
  • touch 命令可以只修改文件的 atime,也可以只修改文件的数据 mtime,但是不能只修改文件的 ctime。因为,不论是修改访问时间,还是修改文件的数据时间,对文件来讲,状态都会发生改变,即 ctime 会随之改变(更新为操作当前文件的真正时间)

    # 建立名为 bols 的空文件
    [root@www ~]# touch bols
    # 查看文件的访问时间
    [root@www ~]# ll --time=atime bols
    # 文件上次的访问时间为 9 月 25 号 21:23
    -rw-r--r-- 1 root root 0 Sep 25 21:23 bols
    [root@localhost ~]# touch bols
    [root@localhost ~]# ll --time=atime bols
    -rw-r--r-- 1 root root 0 May 15 16:36 bols
    # 而如果文件已经存在,则也不会报错,只是会修改文件的访问时间
    # 修改 bols 文件的 atime 和 mtime
    [root@localhost ~]# touch -d "2017-05-04 15:44" bols
    [root@localhost ~]# ll bols; ll --time=atime bols; ll --time=ctime bols
    -rw-r--r-- 1 root root 0 May 4 2017 bols
    -rw-r--r-- 1 root root 0 May 4 2017 bols
    -rw-r--r-- 1 root root 0 Sep 25 21:40 bols
    # ctime 不会变为设定时间,但更新为当前服务器的时间
    

5.2 Linux 文件内容查看

  • 可以使用man 命令来查看各个命令的使用文档,如man cp
命令 功能
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是倒著写 cat
nl 显示的时候,输出行号
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,可以往前翻页
head 只看头几行
tail 只看尾几行

5.2.1 cat 由第一行开始显示文件内容

  • 语法 cat [-AbEnTv]
  • 选项与参数

    • -A:等同于 -vET,可列出一些特殊字符而不是空白
    • -b:列出行号,仅针对非空白行做行号显示,空白行不标行号
    • -E:将结尾的断行字节 $ 显示出来
    • -n:列印出行号,连同空白行也会有行号,与 -b 的选项不同
    • -T:将 [tab] 按键以 ^I 显示出来
    • -v:列出一些看不出来的特殊字符

      # 查看 /etc/issue 文件内容
      [root@www ~]# cat /etc/issue
      CentOS release 6.4 (Final)
      Kernel \r on an \m
      

5.2.2 tac

  • tac 与 cat 命令相反,文件内容从最后一行开始显示,可以看出 tac 是 cat 倒着写

    [root@www ~]# tac /etc/issue
    
    Kernel \r on an \m
    CentOS release 6.4 (Final)
    

5.2.3 nl 显示行号

  • 语法 nl [-bnw] 文件
  • 选项与参数

    • -b:指定行号显示的方式,主要有两种
    • -b a:不论是否为空行,也同样列出行号(类似 cat -n)
    • -b t:如果有空行,空的那一行不要列出行号(默认值)
    • -n:列出行号表示的方法,主要有三种
    • -n ln:行号在荧幕的最左方显示
    • -n rn:行号在自己栏位的最右方显示,且不加 0
    • -n rz :行号在自己栏位的最右方显示,且加 0
    • -w :行号栏位的占用的位数

      # 用 nl 列出 /etc/issue 的内容
      [root@www ~]# nl /etc/issue
      1  CentOS release 6.4 (Final)
      2  Kernel \r on an \m
      

5.2.4 more 一页一页翻动

[root@www ~]# more /etc/man_db.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
--More--(28%)
# 光标在这一行等待命令
  • 在 more 程序的运行过程中,有几个按键可以按
    • 空白键(space):代表向下翻一页
    • Enter:代表向下翻一行
    • /字串:代表在这个显示的内容当中,向下搜寻”字串”关键字
    • :f:立刻显示出文件名以及目前显示的行数
    • q:代表立刻离开 more,不再显示该文件内容
    • b 或 [ctrl]-b:代表往回翻页,不过这动作只对文件有用,对管线无用

5.2.5 less 一页一页翻动

,以下实例输出/etc/man.config文件的内容:

[root@www ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
# :   这里可以等待输入命令
  • less 运行时可以输入的命令
    • 空白键:向下翻动一页
    • [pagedown]:向下翻动一页
    • [pageup]:向上翻动一页
    • /字串:向下搜寻”字串”的功能
    • ?字串:向上搜寻”字串”的功能
    • n:重复前一个搜寻(与 / 或 ? 有关)
    • N:反向的重复前一个搜寻(与 / 或 ? 有关)
    • q:离开 less 程序

5.2.6 head 取出文件前面几行

  • 语法 head [-n number] 文件
  • 选项与参数

    • -n:后面接数字,代表显示几行

      [root@www ~]# head /etc/man.config
      # 默认的情况中,显示前面 10 行
      # 若要显示前 20 行,就得
      [root@www ~]# head -n 20 /etc/man.config
      

5.2.7 tail 取出文件后面几行

  • 语法 tail [-n number] 文件
  • 选项与参数

    • -n:后面接数字,代表显示几行
    • -f:表示持续侦测后面所接的文件名,要等到按下 [ctrl]-c 才会结束 tail

      [root@www ~]# tail /etc/man.config
      # 默认的情况中,显示最后 10 行
      # 若要显示最后的 20 行,就得
      [root@www ~]# tail -n 20 /etc/man.config
      

5.3 Linux 链接

  • Linux 链接分两种:硬链接(Hard Link)和符号链接(Symbolic Link)
  • 默认情况下,ln 命令产生硬链接

5.3.1 硬链接

  • 硬链接指通过索引节点进行链接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)
  • 在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问
  • 硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能
  • 其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除
  • 修改源文件和硬链接文件都会改变另一个文件的数据。硬链接不会建立新的 inode 信息,也不会更改 inode 的总数

5.3.2 软链接

  • 符号链接(Symbolic Link),也叫软链接。软链接文件类似于 Windows 的快捷方式。它实际上是一个特殊的文件,用于指向另一个文件。此链接方式也适用于目录
  • 在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接

5.3.3 inode 属性

  • Linux 目前使用 ext4 文件系统:分区分为两大部分(不考虑超级块),小部分用于保存文件的 inode 信息;剩余大部分用于保存 block 信息
    • iNode 默认大小是 128 Byte,用于记录文件的权限、所有者和属组、大小、ctime、atime、mtime、文件数据的 block 编号,每个文件一个 inode
    • block 默认大小是 4KB。用于实际的数据存储,一个 block 只属于一个文件,可能未占满。一个文件占用的 block 也可以是不连续的
    • 总之,每个文件一个 inode,文件内容由 inode 的记录指向。目录的 block 记录该目录下所有一级子文件和子目录的文件名及对应的 inode。需要根据文件名找到对应的 inode,再找到文件内容所在的 block 块
  • Linux 操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)
  • 文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性存放在 inode 中,至于实际数据则放置到 data block 区块中
    • inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block
  • 还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等
  • 在 Linux 中,可以使用 stat 命令查看某个文件的 inode 信息,包括文件大小、占用的 block 数量、block 大小、文件类型(普通文件或其他)、inode 节点号、链接数、权限、所有者、所属组、访问时间、数据修改时间、状态修改时间

    stat /etc/passwd
    linux-peanut:~/Desktop # stat /etc/passwd
    File: '/etc/passwd'
    Size: 2269          Blocks: 8          IO Block: 4096   regular file
    Device: 802h/2050d    Inode: 1149740     Links: 1
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2018-04-09 17:16:42.000000000 +0800
    Modify: 2018-04-09 17:16:36.000000000 +0800
    Change: 2018-04-09 17:16:36.000000000 +0800
    Birth: -
    

5.3.4 ln 命令

  • 语法 ln [选项] 源文件 目标文件
  • 选项与参数

    • -s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件
    • -f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件
    • 目标文件可以只写路径没有写文件名,会和原名一致
    • 软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错 No such file or directory

      # 创建一个测试文件f1
      [oracle@Linux]$ touch f1
      # 创建f1的一个硬链接文件f2
      [oracle@Linux]$ ln f1 f2
      # 创建f1的一个符号链接文件f3
      [oracle@Linux]$ ln -s f1 f3
      # -i参数显示文件的inode节点信息
      [oracle@Linux]$ ls -li
      total 0
      9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
      9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
      9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1
      # 硬链接文件 f2 与原文件 f1 的 inode 节点相同,均为 9797648,符号链接文件的 inode 节点不同
      [oracle@Linux]$ echo "I am f1 file" >>f1
      [oracle@Linux]$ cat f1
      I am f1 file
      [oracle@Linux]$ cat f2
      I am f1 file
      [oracle@Linux]$ cat f3
      I am f1 file
      [oracle@Linux]$ rm -f f1
      [oracle@Linux]$ cat f2
      I am f1 file
      [oracle@Linux]$ cat f3
      cat: f3: No such file or directory
      # 当删除原始文件 f1 后,硬链接 f2 不受影响,但是符号链接 f1 文件无效
      
  • 删除符号链接 f3,对 f1 f2 无影响

  • 删除硬链接 f2,对 f1 f3 也无影响

  • 删除原文件 f1,对硬链接 f2 没有影响,导致符号链接 f3 失效

  • 同时删除原文件 f1 和 硬链接 f2,整个文件会真正的被删除

相关