Linux文件管理

Linux文件管理


在linux中,一切皆文件,linux把几乎所有的系统资源抽象成为文件的形式,包括硬件设备,网络通信接口等。因此文件管理即为linux的基础。

1. linux目录结构

linux为一个单根的倒置树状目录结构,根目录使用“/”表示,路径中上级和下级目录使用“/”分割,具体目录结构如下:

[root@xuzhichao ~]# ll /
总用量 28
lrwxrwxrwx.   1 root root7 11月  4 2020 bin -usr/bin
dr-xr-xr-x.   5 root root 4096 11月  4 2020 boot
drwxr-xr-x   20 root root 3300 5月   5 21:14 dev
drwxr-xr-x. 135 root root 8192 5月   5 21:16 etc
drwxr-xr-x.   3 root root   16 4月  28 17:50 home
lrwxrwxrwx.   1 root root7 11月  4 2020 lib -usr/lib
lrwxrwxrwx.   1 root root9 11月  4 2020 lib64 -usr/lib64
drwxr-xr-x.   2 root root6 4月  11 2018 media
drwxr-xr-x2 root root0 5月   5 21:14 misc
drwxr-xr-x.   2 root root6 4月  11 2018 mnt
drwxr-xr-x2 root root0 5月   5 21:14 net
drwxr-xr-x.   3 root root   16 11月  4 2020 opt
dr-xr-xr-x  138 root root0 5月   5 21:14 proc
dr-xr-x---.   8 root root 4096 5月   5 21:17 root
drwxr-xr-x   39 root root 1220 5月   5 21:14 run
lrwxrwxrwx.   1 root root8 11月  4 2020 sbin -usr/sbin
drwxr-xr-x.   2 root root6 4月  11 2018 srv
dr-xr-xr-x   13 root root0 5月   5 21:14 sys
drwxrwxrwt.  11 root root 4096 5月   5 21:17 tmp
drwxr-xr-x.  13 root root  155 11月  4 2020 usr
drwxr-xr-x.  21 root root 4096 11月  4 2020 var

linux的文件目录规范遵循FHS规范,各个目录的主要意义如下:

  • /boot
    系统启动引导文件存放的目录,主要包括引导程序Bootloader,内核文件,initramfs文件等内容。
    /boot目录内容如下:
[root@xuzhichao ~]# ll /boot/
-rw-r--r--. 1 root root   153562 4月   1 2020 config-3.10.0-1127.el7.x86_64   //内核编译配置文件
drwxr-xr-x. 3 root root   17 11月  4 2020 efi   
drwxr-xr-x. 2 root root   27 11月  4 2020 grub
drwx------. 5 root root   97 11月  4 2020 grub2   //grub2引导程序目录
-rw-------. 1 root root 77654357 11月  4 2020 initramfs-0-rescue-d9abb103c9b943b0bfbbb212ed3dee7f.img
-rw-------. 1 root root 31943320 11月  4 2020 initramfs-3.10.0-1127.el7.x86_64.img   //ramfs文件
-rw-------. 1 root root 13885304 11月  4 2020 initramfs-3.10.0-1127.el7.x86_64kdump.img
-rw-r--r--. 1 root root   320512 4月   1 2020 symvers-3.10.0-1127.el7.x86_64.gz
-rw-------. 1 root root  3611662 4月   1 2020 System.map-3.10.0-1127.el7.x86_64
-rwxr-xr-x. 1 root root  6762688 11月  4 2020 vmlinuz-0-rescue-d9abb103c9b943b0bfbbb212ed3dee7f  //救援模式
-rwxr-xr-x. 1 root root  6762688 4月   1 2020 vmlinuz-3.10.0-1127.el7.x86_64   //内核文件
  • /bin
    存放所有用户使用的基本命令,该目录不能独立分区,系统在启动时会使用该目录下的文件。

  • /sbin
    存放root用户使用的命令,该目录不能独立分区,系统在启动时会使用该目录下的文件。

  • /lib
    存放系统启动时程序依赖的基本共享库文件,/lib/modules用于存放内核模块文件,/lib64目录与/lib目录作用类似,只是专用于存储x86_64系统的共享库文件。

  • /etc
    该目录专用于放置系统和程序的配置文件,

    • /etc/sysconfig/network-scripts/: 用于存放网卡和路由相关的配置文件;

    • /etc/hostname: 放置主机名解析配置文件;

    • /etc/serivice: 放置系统服务器名称与端口号对应的文件;

  • /home
    普通用户的家目录。

    • /home/USERNAME: 放置USERNAME用户的相关数据,会自动复制/etc/skel中的文件到用户目录下;
[root@xuzhichao ~]# ll /etc/skel/ -a
总用量 24
drwxr-xr-x.   3 root root   78 11月  4 2020 .
drwxr-xr-x. 135 root root 8192 5月   5 21:16 ..
-rw-r--r--.   1 root root   18 4月   1 2020 .bash_logout    //定义用户登出执行的脚本
-rw-r--r--.   1 root root  193 4月   1 2020 .bash_profile   //定义用户变量等内容
-rw-r--r--.   1 root root  231 4月   1 2020 .bashrc         //定义用户别名等内容
drwxr-xr-x.   4 root root   39 11月  4 2020 .mozilla  
  • /root
    管理员用户的家目录。

  • /proc
    一个虚拟的文件系统,内容是当前系统正在运行的实时状态,包括进程运行的实时状态,内核参数等。

    • /proc/NUMBER:表示进程号为NUMBER的进程运行状态
[root@xuzhichao ~]# ls /proc/sys/   //调整内核参数目录
abi  crypto  debug  dev  fs  kernel  net  sunrpc  user  vm
  • /dev
    设备文件的存放目录。

    • /dev/null : 黑洞设备,类似于垃圾回收站;
    • /dev/random:随机设备,可产生随机字符;
    • /dev/zero:能源源不断生成数据;
  • /usr

    unix system resources 的缩写,linux最重要的目录之一,上文提到的/bin /sbin /lib /lib64均是/usr对应目录的软连接,同时/usr/local目录还用于用户应用程序的安装。

  • /var

    存放一些变化的文件。

    • /var/log:存放日志文件
    • /var/tmp:进程产生的临时文件
  • /tmp

    存放临时文件。

  • /opt

    第三方应用程序的安装位置。

  • /media

    便携式媒体设备挂载点,;例如光盘。

  • /mnt

    临时文件系统挂载点。

  • /srv

    系统上运行的服务使用到的数据。

1.1. 绝对路径与相对路径

  • 绝对路径:即从根目录“/”开始的路径。

  • 相对路径:相对从当前目录开始表示的路径。

    • “.”:表示当前所在目录。
    • “..”:表示当前目录的上一级目录,即父目录。
      [root@xuzhichao ~]# pwd       
      /root
      [root@xuzhichao ~]# cd ..        #切换至父目录
      [root@xuzhichao /]# pwd
      /
      [root@xuzhichao /]# cd .         #切换至当前目录
      [root@xuzhichao /]# pwd
      /
    

1.2. 切换目录命令cd

cd 命令格式:

cd 切换到的目录名称

cd命令常见用法:

[root@xuzhichao ~]# cd /home/
[root@xuzhichao home]# cd -    #切换到之前的工作目录
/root
[root@xuzhichao ~]# cd ..      #切换到上层目录
[root@xuzhichao /]# cd ~       #切换到当前用户的家目录
[root@xuzhichao ~]# cd ~xu     #切换到xu用户的家目录
[root@xuzhichao xu]# pwd
/home/xu
[root@xuzhichao xu]# cd .      #切换到当前目录
[root@xuzhichao xu]# cd ..     #切换到上级目录
[root@xuzhichao home]# 

2.Linux文件类型

linux中有很多的文件类型,可以通过ls -l命令查看,最左边的一个字符即为文件的类型,linux中文件类型主要有以下几种:

  • 普通文件(-)

    普通文件又可以分为以下几种:

    • 纯文本文件

      例如常见的配置文件:

      [root@xuzhichao home]# cat /etc/issue      #系统登录前的提示信息
      \S
      Kernel \r on an \m
      
      [root@xuzhichao home]# cat /etc/motd       #系统登录成功后的提示信息
      
    • 二进制可执行文件

      二进制文件通过是可以运行的,不支持使用cat命令直接查看,查看时显示未乱码。

        [root@xuzhichao home]# ll /bin/cat
        -rwxr-xr-x. 1 root root 54080 Aug 20  2019 /bin/cat
        [root@xuzhichao home]# ll /bin/awk
        lrwxrwxrwx. 1 root root 4 Nov  4  2020 /bin/awk -> gawk
        [root@xuzhichao home]# ll /bin/grep
        -rwxr-xr-x. 1 root root 159024 Aug  3  2017 /bin/grep
      
      
      
    • 数据格式文件

      数据格式文件时一些程序在运行过程中需要读取的特定格式的文件,通常只能由该程序打开。

      [root@xuzhichao home]# ll /var/log/wtmp   #该文件只能使用last命令查看,显示最近系统登录的用户,终端,登录地址,时间等信息。
      -rw-rw-r--. 1 root utmp 19968 May  6 12:22 /var/log/wtmp
      [root@xuzhichao home]# last
      root     pts/0        192.168.20.1     Thu May  6 12:22   still logged in   
      root     pts/0        192.168.20.1     Wed May  5 21:17 - 12:22  (15:05)    
      root     pts/0        192.168.20.1     Wed May  5 21:14 - 21:16  (00:02)    
      reboot   system boot  3.10.0-1127.el7. Wed May  5 21:14 - 14:32  (17:18)    
      root     pts/0        192.168.20.1     Wed Apr 28 09:50 - crash (7+11:23)   
      root     pts/0        192.168.20.1     Wed Apr 28 09:48 - 09:50  (00:01)    
      root     pts/0        192.168.20.1     Wed Apr 28 09:28 - 09:48  (00:20)    
      root     tty1                          Wed Apr 28 09:27 - 00:06  (14:38)    
      reboot   system boot  3.10.0-1127.el7. Wed Apr 28 09:25 - 14:32 (8+05:06)   
      root     pts/0        192.168.20.1     Tue Nov  3 17:48 - down   (00:44)    
      root     pts/0        192.168.20.1     Tue Nov  3 17:47 - 17:48  (00:01)    
      root     pts/0        192.168.20.1     Tue Nov  3 17:42 - 17:47  (00:04)    
      root     pts/0        192.168.20.1     Tue Nov  3 17:37 - 17:42  (00:05)    
      root     tty1                          Tue Nov  3 17:28 - 18:33  (01:04)    
      reboot   system boot  3.10.0-1127.el7. Wed Nov  4 01:27 - 18:33  (-6:-54)   
      root     tty1                          Wed Nov  4 01:13 - 01:27  (00:14)    
      root     tty1                          Wed Nov  4 01:12 - 01:12  (00:00)    
      xu       pts/1        :0               Wed Nov  4 01:11 - down   (00:15)    
      xu       pts/0        :0               Wed Nov  4 01:11 - down   (00:16)    
      xu       :0           :0               Wed Nov  4 01:11 - down   (00:16)    
      reboot   system boot  3.10.0-1127.el7. Wed Nov  4 01:10 - 01:27  (00:16)    
      reboot   system boot  3.10.0-1127.el7. Wed Nov  4 01:06 - 01:27  (00:21)    
      reboot   system boot  3.10.0-1127.el7. Wed Nov  4 00:46 - 01:27  (00:40)    
      
      wtmp begins Wed Nov  4 00:46:56 2020
      
  • 目录文件(d)

    即一般的目录。

  • 链接文件(l)

    链接文件即将两个文件建立一个关联关系。链接分为硬链接和软连接,硬链接为文件访问的另外一个入口,软连接类似于windows中的快捷方式。

  • 管道文件(p)

    管道文件是一个伪文件,实际为一段内核缓冲区,主要用于进程间的通信,只支持半双工模式,即同一时间只能用于一个方向传输数据。

    [root@xuzhichao home]# ll /run
    prw-------  1 root           root              0 May  5 21:14 autofs.fifo-misc
    prw-------  1 root           root              0 May  5 21:14 autofs.fifo-net
    
  • 字符设备文件(c)

    通常是串行接口设备的文件,例如鼠标,键盘。

    [root@xuzhichao home]# ll /dev/zero /dev/null /dev/tty*
    crw-rw-rw- 1 root root    1,  3 May  5 21:14 /dev/null
    crw-rw-rw- 1 root tty     5,  0 May  5 21:14 /dev/tty
    crw--w---- 1 root tty     4,  0 May  5 21:14 /dev/tty0
    crw--w---- 1 root tty     4,  1 May  5 21:14 /dev/tty1
    crw--w---- 1 root tty     4, 10 May  5 21:14 /dev/tty10
    crw--w---- 1 root tty     4, 11 May  5 21:14 /dev/tty11
    crw--w---- 1 root tty     4, 12 May  5 21:14 /dev/tty12
    
  • 块设备文件(b)

    一般为磁盘,硬盘等以“块”为单位进行随机访问的设备。

    [root@xuzhichao home]# ll /dev/sd*
    brw-rw---- 1 root disk 8, 0 May  5 21:14 /dev/sda
    brw-rw---- 1 root disk 8, 1 May  5 21:14 /dev/sda1
    brw-rw---- 1 root disk 8, 2 May  5 21:14 /dev/sda2
    
  • 套接字文件(s)

    socket,通常被用于基于网络的数据通信使用,可实现一台主机的两个进程之间通过网络进行通信。

    [root@xuzhichao home]# ll /run/*.sock
    srw-rw-rw- 1 root root 0 May  5 21:14 /run/gssproxy.sock
    srw-rw-rw- 1 root root 0 May  5 21:14 /run/rpcbind.sock
    

PS:与windows不同,Linux的文件扩展名一般不代表任何意义(压缩文件除外),仅用于人为区分文件类型。

2.1 file命令:查看文件类型

file命令可用于判断一个文件的类型,然后使用适当的命令来打开文件。

语法如下:

[root@xuzhichao home]# file --help
Usage: file [OPTION...] [FILE...]

  -b, --brief                   #列出文件辨识结果时,不显示文件名称。
  -f, --files-from FILE         #列出文件FILE中包含的所有文件名的文件类型
  -F, --separator STRING        #指定显示结果中文件和文件类型之间的分隔符,默认为“:”
  -L, --dereference             #显示软连接对应的真实文件的文件类型,默认为显示软连接本身的软件类型
  -z                            #尝试去解读压缩文件的内容

file常见用法如下:

[root@xuzhichao home]# file /bin/cat      #二进制格式文件,格式为ELK
/bin/cat: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=b97cc8358edb123e8a9e21390f30924fe66a5e55, stripped
[root@xuzhichao home]# file /etc/passwd   #普通文件文件
/etc/passwd: ASCII text
[root@xuzhichao home]# file /var/log/wtmp #数据文件
/var/log/wtmp: data 
[root@xuzhichao home]# file /dev/sda      #块设备文件
/dev/sda: block special
[root@xuzhichao home]# file /dev/zero     #字符设备文件
/dev/zero: character special
[root@xuzhichao home]# file /etc/grub2.cfg   #软链接文件
/etc/grub2.cfg: symbolic link to `../boot/grub2/grub.cfg'
[root@xuzhichao home]# file -L /etc/grub2.cfg   #显示软链接的真实文件类型
/etc/grub2.cfg: ASCII text
[root@xuzhichao home]# file -b /dev/zero      #显示时不输出文件名
character special
[root@xuzhichao home]# file -F "=====" /dev/zero    #执行显示时的分隔符
/dev/zero===== character special

3.Linux文件和目录操作

3.1 tree命令:查看文件目录结构

使用前需要预先安装:

[root@xuzhichao home]# yum install tree -y

tree常用参数如下:

选项 说明
-a 显示当前目录的所有文件和目录
-d 仅显示目录
-L 指定显示目录的层级
-p 显示权限属性

tree的用法如下:

#查看boot下所有的目录和文件
[root@xuzhichao home]# tree  /boot/
/boot/
|-- System.map-3.10.0-1127.el7.x86_64
|-- config-3.10.0-1127.el7.x86_64
|-- efi
|   `-- EFI
|       `-- centos
|-- grub
|   `-- splash.xpm.gz
|-- grub2
|   |-- device.map
|   |-- fonts
|   |   `-- unicode.pf2
|   |-- grub.cfg
|   |-- grubenv
|   |-- i386-pc
|   |   |-- acpi.mod
|   |   |-- adler32.mod
|   |   |-- affs.mod

...(省略部分内容)...
8 directories, 315 files

#查看/boot目录下的一级目录
[root@xuzhichao home]# tree -d -L 1 /boot/
/boot/
|-- efi
|-- grub
`-- grub2

3 directories

#查看/boot目录下的二级目录
[root@xuzhichao home]# tree -d -L 2 /boot/
/boot/
|-- efi
|   `-- EFI
|-- grub
`-- grub2
    |-- fonts
    |-- i386-pc
    `-- locale

7 directories

#查看/boot目录下的二级目录并显示权限
[root@xuzhichao home]# tree -d -L 2 -p /boot/
/boot/
|-- [drwxr-xr-x]  efi
|   `-- [drwxr-xr-x]  EFI
|-- [drwxr-xr-x]  grub
`-- [drwx------]  grub2
    |-- [drwxr-xr-x]  fonts
    |-- [drwxr-xr-x]  i386-pc
    `-- [drwxr-xr-x]  locale

7 directories

3.2 ls命令:查看文件列表

ls命令用于查看文件或目录的信息,语法格式如下:

ls [OPTION]... [FILE]...

常用的选项如下:

选项 说明
-l 显示长格式的文件列表
-a 显示以“.”开头的隐藏文件
-d 仅显示目录本身,不显示目录下的内容
-i 显示文件的inode编号
-R 递归显示目录及其子目录下的内容
-r 反向排序
-t 用文件的mtime时间排序
-h 以人性化格式显示文件大小
-S 以文件大小排序
--time= 输出访问时间(atime)或文件属性改变的时间(ctime)
--full-time 显示文件的完整时间格式

ls命令用法如下:

#示例一:查看文件的inode编号
[root@xuzhichao ~]# ll -i
total 12
67160130 -rw-------. 1 root root 2109 Nov  4  2020 anaconda-ks.cfg
67160136 -rw-r--r--. 1 root root 2157 Nov  4  2020 initial-setup-ks.cfg
67160134 -rw-r--r--  1 root root 1883 Apr 28 09:54 passwd

#示例二:以易读方式显示文件大小
[root@xuzhichao ~]# ll -h
total 12K
-rw-------. 1 root root 2.1K Nov  4  2020 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.2K Nov  4  2020 initial-setup-ks.cfg
-rw-r--r--  1 root root 1.9K Apr 28 09:54 passwd

#示例三:显示文件完整时间
[root@xuzhichao ~]# ll -h --full-time
total 12K
-rw-------. 1 root root 2.1K 2020-11-04 00:44:12.239050460 +0800 anaconda-ks.cfg
-rw-r--r--. 1 root root 2.2K 2020-11-04 00:47:49.734337768 +0800 initial-setup-ks.cfg
-rw-r--r--  1 root root 1.9K 2021-04-28 09:54:31.071120488 +0800 passwd

#示例四:只显示/boot下的目录
[root@xuzhichao ~]# ls -d /boot/*/
/boot/efi/  /boot/grub/  /boot/grub2/

#示例五:只显示当前目录的隐藏文件
[root@xuzhichao ~]# l.
.  ..  .Xauthority  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache  .config  .cshrc  .dbus  .kde  .local  .pki  .tcshrc  .viminfo
[root@xuzhichao ~]# ls -d .*
.  ..  .Xauthority  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache  .config  .cshrc  .dbus  .kde  .local  .pki  .tcshrc  .viminfo

#示例六:递归显示当前目录下的内容,包括隐藏文件
[root@xuzhichao ~]# ls -R -a
.:
.  ..  .Xauthority  .bash_history  .bash_logout  .bash_profile  .bashrc  .cache  .config  .cshrc  .dbus  .kde  .local  .pki  .tcshrc  .viminfo  anaconda-ks.cfg  initial-setup-ks.cfg  passwd

./.cache:
.  ..  abrt  dconf

./.cache/abrt:
.  ..  lastnotification
...(省略部分内容)...

默认linux为ls命令设置了别名:

alias l.='ls -d .* --color=auto'   
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'

3.3 cp命令:复制文件或目录

cp命令的语法如下:

Usage: cp [OPTION]... [-T] SOURCE DEST        #复制源文件到目标文件
  or:  cp [OPTION]... SOURCE... DIRECTORY     #复制多个文件到目标目录下
  or:  cp [OPTION]... -t DIRECTORY SOURCE...  #复制多个文件到目标目录下,先写目录,后写文件

cp复制时各种情况如下:

cp选项如下:

选项 说明
-a 相当于pdr的合集
-d 若源文件为链接文件,复制链接文件而非源文件本身,默认会复制源文件本身
-f 强制复制,若目标文件已存在,删除目标文件后再复制
-p 复制时把源文件的属性一同复制过去(备份常用)
-r 递归复制,用于目录的复制
-u 只复制源文件比目标文件新的文件或目标不存在的文件
--backup=numbered 若目标存在,在覆盖目标文件前先备份目标文件,加上数字后缀
-i 若目标文件存在,在覆盖目标前会提示是否覆盖
-v 显示过程

cp命令的用法如下:

[root@xuzhichao ~]# cp /etc/fstab fstab
#使用--backup=numbered参数复制时自动备份原文件。
[root@xuzhichao ~]# cp --backup=numbered /etc/fstab fstab 
cp: overwrite 'fstab'? y
[root@xuzhichao ~]# ll fstab*
-rw-r--r-- 1 root root 465 May 10 17:22 fstab
-rw-r--r-- 1 root root 465 May 10 17:19 fstab.~1~

#备份使用-a参数,复制目录使用-r参数
[root@xuzhichao ~]# cp -a /boot/ .

#复制文件不改名
[root@xuzhichao ~]# cp /etc/passwd /tmp/

#复制文件并改名
[root@xuzhichao ~]# cp /etc/passwd /tmp/passwd-1

#复制并备份文件:
[root@xuzhichao ~]# cp /tmp/passwd{,.bak}
[root@xuzhichao ~]# ll /tmp/passwd*
-rw-r--r-- 1 root root 1883 May 10 17:29 /tmp/passwd
-rw-r--r-- 1 root root 1883 May 10 17:30 /tmp/passwd.bak

3.4 mv命令:移动文件或目录

mv命令的语法如下:

Usage: mv [OPTION]... [-T] SOURCE DEST
  or:  mv [OPTION]... SOURCE... DIRECTORY
  or:  mv [OPTION]... -t DIRECTORY SOURCE...

mv命令参数如下:

选项 说明
-i 若目标文件存在,在覆盖目标前会提示是否覆盖
-f 强制移动,若目标文件已存在,删除目标文件后再复制

在使用mv移动文件或目录时:

  • 如果移动的源和目标文件在同一个分区时,相当于先删除原有目录下文件的名称,然后在新的目录下创建该文件的名称,文件本身并未移动,其inode不变,故此时的移动速度很快。
  • 如果移动的源和目的不在同一个分区时,相当于先复制该文件到新的目录下,然后再删除原文件,移动速度会较慢。

mv命令的用法如下:

#在本目录下移动文件
[root@xuzhichao tmp]# mv passwd passwd1
[root@xuzhichao tmp]# mkdir test

#把文件移动到test目录中
[root@xuzhichao tmp]# mv passwd1 test/

#把多个文件或目录移动到一个目录下
[root@xuzhichao tmp]# mkdir dir{1,2,3}
[root@xuzhichao tmp]# touch file{1,2,3}
[root@xuzhichao tmp]# mv dir1/ dir2/ dir3/ file1 file2 file3 test/

3.5 mkdir命令:创建目录

mkdir用于创建空目录:

Usage: mkdir [OPTION]... DIRECTORY...

参数如下:

选项 说明
-p 递归创建目录
-v 显示过程

用法如下:

#创建目录
[root@xuzhichao tmp]# mkdir test2

#递归创建目录,dir1,dir2,dir3,dir4目录不存在时同时创建。
[root@xuzhichao tmp]# mkdir -pv dir1/dir2/dir3/dir4
mkdir: created directory 'dir1'
mkdir: created directory 'dir1/dir2'
mkdir: created directory 'dir1/dir2/dir3'
mkdir: created directory 'dir1/dir2/dir3/dir4'
[root@xuzhichao tmp]# ll dir1/dir2/dir3/dir4
total 0

#{ }的使用:
[root@xuzhichao tmp]# mkdir -pv dir/dir1/{x,y}/{a,b}
mkdir: created directory 'dir'
mkdir: created directory 'dir/dir1'
mkdir: created directory 'dir/dir1/x'
mkdir: created directory 'dir/dir1/x/a'
mkdir: created directory 'dir/dir1/x/b'
mkdir: created directory 'dir/dir1/y'
mkdir: created directory 'dir/dir1/y/a'
mkdir: created directory 'dir/dir1/y/b'
[root@xuzhichao tmp]# mkdir -pv dir/dir2/{x/{a,b},y}
mkdir: created directory 'dir/dir2'
mkdir: created directory 'dir/dir2/x'
mkdir: created directory 'dir/dir2/x/a'
mkdir: created directory 'dir/dir2/x/b'
mkdir: created directory 'dir/dir2/y'
[root@xuzhichao tmp]# mkdir -pv dir/dir{3,4,5/dir{6,7}}
mkdir: created directory 'dir/dir3'
mkdir: created directory 'dir/dir4'
mkdir: created directory 'dir/dir5'
mkdir: created directory 'dir/dir5/dir6'
mkdir: created directory 'dir/dir5/dir7'
[root@xuzhichao tmp]# tree dir
dir
|-- dir1
|   |-- x
|   |   |-- a
|   |   `-- b
|   `-- y
|       |-- a
|       `-- b
|-- dir2
|   |-- x
|   |   |-- a
|   |   `-- b
|   `-- y
|-- dir3
|-- dir4
`-- dir5
    |-- dir6
    `-- dir7

3.6 文件的时间属性mtime,ctime,atime

一个文件主要有三种时间属性,分别为mtime,ctime,atime。

  • mtime:

    mtime(modify time)为文件内容被修改的最后时间,即文件的block发生变化,例如使用vim编辑文件。

  • atime:

    atime(access time)显示的是文件最后被访问的时间,比如系统的进程直接使用或通过一些命令和脚本间接使用。(执行一些可执行文件或脚本)。

  • ctime:

    ctime(change time)显示的是文件的权限、拥有者、所属的组、链接数发生改变时的时间。当然当内容改变时也会随之改变,即inode内容发生改变和Block内容发生改变时ctime都会发生变化。

PS:从kernel2.6.29开,还默认集成了一个relatime的属性。可能是因为在文件读操作很频繁的系统中,atime更新所带来的开销很大,所以在挂装文件系统的时候使用noatime属性来停止更新atime。但是有些程序需要根据atime进行一些判断和操作,所以Linux就推出了一个relatime特性。 使用这个特性来挂装文件系统后,只有当mtime比atime更新的时候,才会更新atime。事实上,这个时候atime和mtime已经是同一个东西了。所以这个选项就是为了实现对atime的兼容才推出的。并不是一个新的时间属性。使用方法就是通过mount -o relatime /dir来挂装目录.

3.7 stat命令:查看文件的三个时间属性

stat用法如下:

[root@xuzhichao tmp]# stat /tmp
  File: '/tmp'
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d	Inode: 33554504    Links: 16
Access: (1777/drwxrwxrwt)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 21:52:33.386227675 +0800    #atime值
Modify: 2021-05-11 21:52:48.553724623 +0800    #mtime值
Change: 2021-05-11 21:52:48.553724623 +0800    #ctime值
 Birth: -
[root@xuzhichao tmp]# stat /etc/passwd
  File: '/etc/passwd'
  Size: 1883      	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33568564    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 21:43:39.607999954 +0800
Modify: 2021-04-28 17:50:33.525833571 +0800
Change: 2021-04-28 17:50:33.529833550 +0800
 Birth: -

3.8 touch命令:创建空文件

touch命令用于创建空文件,若文件存在,不会覆盖文件,只会修改文件的三个时间属性为当前时间。

touch选项如下:

选项 说明
-a 仅修改文件的atime值
-m 仅修改文件的mtime值
-c 如果文件不存在则不创建文件
-t 使用 [[CC]YY]MMDDhhmm[.ss] 格式指定atime和mtime值
-d -a和-m选项仅能修改时间为当前时间,配合-d选项可以修改为其他时间

touch的用法如下:

#1.创建文件
[root@xuzhichao tmp]# touch file1
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-05-11 22:38:30.060549100 +0800
Change: 2021-05-11 22:38:30.060549100 +0800
 Birth: -
 
 #2.修改文件内容时mtime和ctime都会发生改变
[root@xuzhichao tmp]# echo "sda" > file1
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-05-11 22:38:47.815379021 +0800
Change: 2021-05-11 22:38:47.815379021 +0800
 Birth: -
 
#3.使用-m可以修改文件的mtime和ctime为当前时间
[root@xuzhichao tmp]# touch -m file1 
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-05-11 22:39:17.392095691 +0800
Change: 2021-05-11 22:39:17.392095691 +0800
 Birth: -
 
#4.使用-m和-d结合使用仅会改变文件的mtime时间。
[root@xuzhichao tmp]# touch -m -d 20210330 file1 
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 22:38:30.060549100 +0800
Modify: 2021-03-30 00:00:00.000000000 +0800
Change: 2021-05-11 22:39:42.484847211 +0800
 Birth: -
 
#5.使用-a和-d结合使用仅会改变文件的atime时间。
[root@xuzhichao tmp]# touch -a -d 20210331 file1 
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-03-31 00:00:00.000000000 +0800
Modify: 2021-03-30 00:00:00.000000000 +0800
Change: 2021-05-11 22:40:15.008515806 +0800
 Birth: -
 
#6.使用-a可以修改文件的atime和ctime为当前时间
[root@xuzhichao tmp]# touch -a file1 
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-11 22:40:25.829405550 +0800
Modify: 2021-03-30 00:00:00.000000000 +0800
Change: 2021-05-11 22:40:25.829405550 +0800
 Birth: -

#7.使用-t可以任意修改文件的atime和mtime为指定的时间
[root@xuzhichao tmp]# touch -t 202104201010 file1 
[root@xuzhichao tmp]# stat file1
  File: 'file1'
  Size: 4         	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554501    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-04-20 10:10:00.000000000 +0800
Modify: 2021-04-20 10:10:00.000000000 +0800
Change: 2021-05-11 22:41:18.201871892 +0800
 Birth: -
 
#8.使用-c时,文件不存在就不创建文件
[root@xuzhichao tmp]# touch -c file2
[root@xuzhichao tmp]# ll file2
ls: cannot access file2: No such file or directory

3.9 rmdir命令:删除空目录

rmdir命令仅用于删除空的目录,当目录中存在文件时无法删除。

rmdir用法如下:

#递归创建和删除目录
[root@xuzhichao tmp]# mkdir dir1/dir2/dir3/dir4 -p
[root@xuzhichao tmp]# rmdir dir1/dir2/dir3/dir4 -p

#目录中存在文件时无法删除目录
[root@xuzhichao /]# rmdir /tmp/
rmdir: failed to remove '/tmp/': Device or resource busy

3.10 rm命令:删除文件或目录

rm命令用于删除文件或目录,无论文件或目录是否为空。

rm命令的删除过程是:

  1. 删除目录下文件的文件名链接数,释放inode号;
  2. 当没有新文件写入时文件的block并未被删除;
  3. 当有新文件写入时恰巧使用到该block时就会删除其block,此时才会真正的删除文件内容。

因此删除文件时才有机会找回文件。

rm的选项如下:

选项 说明
-r 删除目录需要使用该参数
-f 强制删除
-i 删除前提示是否删除文件

rm的用法如下:

#删除目录使用-r参数
[root@xuzhichao tmp]# rm -rf dir

#rm别名使用了-i参数,删除前会需要用户确认
[root@xuzhichao tmp]# rm file1 
rm: remove regular file 'file1'? y

3.10.1 删除大文件的方法

有些情况下,当一个大文件正在使用时,通过rm删除文件后,磁盘空间并没有得到释放,此时可使用以下两种方法:

  1. 使用 > bigfile && rm -f bigfile 的方法;
  2. 使用killall停止正在使用文件的进程,然后再删除该文件;

3.11 rename命令:批量修改文件名称

rename命令可用于批量重命名文件

rename语法如下:

rename [options] expression replacement file...

主要用法如下:

[root@xuzhichao test]# touch file{0..10}.conf
[root@xuzhichao test]# ls
file0.conf  file1.conf  file10.conf  file2.conf  file3.conf  file4.conf  file5.conf  file6.conf  file7.conf  file8.conf  file9.conf

#把所有后缀为.conf的文件,批量改名为.conf.bak
[root@xuzhichao test]# rename .conf .conf.bak *.conf
[root@xuzhichao test]# ls
file0.conf.bak  file1.conf.bak  file10.conf.bak  file2.conf.bak  file3.conf.bak  file4.conf.bak  file5.conf.bak  file6.conf.bak  file7.conf.bak  file8.conf.bak  file9.conf.bak

#把所有后缀为.bak的文件,批量改名为.conf
[root@xuzhichao test]# rename '.bak' '' *.bak
[root@xuzhichao test]# ls
file0.conf  file1.conf  file10.conf  file2.conf  file3.conf  file4.conf  file5.conf  file6.conf  file7.conf  file8.conf  file9.conf

#把file的number都加一个0
[root@xuzhichao test]# rename file file0 file??.conf
[root@xuzhichao test]# ls
file0.conf  file010.conf  file1.conf  file2.conf  file3.conf  file4.conf  file5.conf  file6.conf  file7.conf  file8.conf  file9.conf
[root@xuzhichao test]# rename file file0 file?.conf
[root@xuzhichao test]# ls
file00.conf  file01.conf  file010.conf  file02.conf  file03.conf  file04.conf  file05.conf  file06.conf  file07.conf  file08.conf  file09.conf

4 inode和链接文件

4.1 文件和目录的inode和block

  • data block:数据块是用于记录文件的实际内容的地方;

  • 元数据metadata:用于记录文件的大小,时间,所有者等信息,这些信息存放在inode中,inode主要内容如下:

    • 文件字节数
    • 文件的UID,GID
    • 文件的读写权限
    • 文件的时间戳
    • 链接数,即有多少文件指向此inode
    • 文件data block的位置
  • inode:目录的inode与文件类似,主要用于存放目录的元数据信息,包括时间,权限,属主,目录的data block的位置等。

  • data block:目录的data block主要用于存放该目录下所有文件和目录的名称以及其对应的inode号。

查看文件和目录的inode的方法如下:

#方法一:使用ls -i参数
[root@xuzhichao ~]# ll -i /tmp -d
33554504 drwxrwxrwt. 14 root root 4096 May 12 21:31 /tmp
[root@xuzhichao ~]# ll -i /etc/fstab 
33554498 -rw-r--r--. 1 root root 465 Nov  4  2020 /etc/fstab

#方法二:使用stat命令
[root@xuzhichao ~]# stat /etc/fstab 
  File: '/etc/fstab'
  Size: 465       	Blocks: 8          IO Block: 4096   regular file
Device: fd00h/64768d	Inode: 33554498    Links: 1
Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2021-05-10 17:19:30.401892527 +0800
Modify: 2020-11-04 00:29:44.523009084 +0800
Change: 2020-11-04 00:44:11.887050443 +0800
 Birth: -

目录的链接数为该目录下目录的个数+2,每个新的目录链接数都为2,一个是其本身,一个是该目录下的 ”.“ ,在该目录下每创建一个子目录,上级目录的链接数就增加1,因为子目录的下”..“与上级目录的inode号相同。这就是为什么”.“代表当前目录,而”..“代表上级目录的原因了,实际两者相当于硬链接的概念了。

#查看目录的inode号
[root@xuzhichao tmp]# mkdir dir1
[root@xuzhichao tmp]# ll -d dir1 -i
67424894 drwxr-xr-x 2 root root 6 May 12 21:47 dir1

#“.”的inode号和当前目录的inode号一致;“..”的inode号和上级目录一致。
[root@xuzhichao tmp]# ll -i dir1/ -a
total 4
67424894 drwxr-xr-x   2 root root    6 May 12 21:47 .
33554504 drwxrwxrwt. 15 root root 4096 May 12 21:48 ..
[root@xuzhichao tmp]# ll -di /tmp
33554504 drwxrwxrwt. 15 root root 4096 May 12 21:48 /tmp

#每增加一个目录上级目录的链接数加1
[root@xuzhichao tmp]# mkdir dir1/dir2
[root@xuzhichao tmp]# ll -d dir1/
drwxr-xr-x 3 root root 4096 May 12 21:51 dir1/
[root@xuzhichao tmp]# mkdir dir1/dir{a..z}
[root@xuzhichao tmp]# ll -d dir1/
drwxr-xr-x 29 root root 4096 May 12 21:51 dir1/
  • 每个inode都有一个号码,类似于我们的身份证号,操作系统用inode号码来识别不同的文件。

    Linux系统内部不使用文件名,而使用inode号码来识别文件。文件名只是人们便于识别inode的别称或者绰号。

    表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:

    1. 首先,系统找到这个文件名对应的inode号码;
    2. 其次,通过inode号码,获取inode信息;
    3. 最后,根据inode信息,找到文件数据所在的block,读出数据。

    文件读取过程示意图:

文件存储结构示意图:

img

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。

一个是数据区,存放文件数据;

另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。 查看每个硬盘分区的inode总数和已经使用的数量,可以使用df -i 命令。

[root@xuzhichao tmp]# df -i
Filesystem                Inodes  IUsed    IFree IUse% Mounted on
devtmpfs                  228616    394   228222    1% /dev
tmpfs                     232880      1   232879    1% /dev/shm
tmpfs                     232880    779   232101    1% /run
tmpfs                     232880     16   232864    1% /sys/fs/cgroup
/dev/mapper/centos-root 26214400 138317 26076083    1% /
/dev/sda1                 256000    327   255673    1% /boot
tmpfs                     232880      1   232879    1% /run/user/0

4.2 硬链接

一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Linux系统允许多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

硬链接示意图:

image

硬链接的源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

创建硬链接的方法如下:

ln [OPTION]... [-T] TARGET LINK_NAME
[root@xuzhichao tmp]# touch file1
[root@xuzhichao tmp]# ll file1 
-rw-r--r-- 1 root root 0 May 12 22:13 file1
[root@xuzhichao tmp]# ln file1 file1_hardlink
[root@xuzhichao tmp]# ll file1
-rw-r--r-- 2 root root 0 May 12 22:13 file1    #文件的链接数加1
[root@xuzhichao tmp]# ll file1_hardlink 
-rw-r--r-- 2 root root 0 May 12 22:13 file1_hardlink

硬链接存在如下特性:

  1. 原文件和硬链接文件有相同的inode和data block
  2. 只能对已经存在的文件创建硬链接
  3. 不能对目录创建硬链接
  4. 不能跨分区或文件系统创建硬链接
  5. 删除一个原始文件并不影响硬链接文件

因为硬链接存在上述的诸多限制,因此在实际工作中较少使用。

4.3 软链接

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

软链接示意图:

image

软链接的内容为实际文件的文件名,软链接的大小为实际文件文件名的字符数。

软链接用法如下,ln -s:

[root@xuzhichao tmp]# ln -s file1 file1_softlink
[root@xuzhichao tmp]# ll file1*
-rw-r--r-- 2 root root 0 May 12 22:13 file1
-rw-r--r-- 2 root root 0 May 12 22:13 file1_hardlink
lrwxrwxrwx 1 root root 5 May 12 22:50 file1_softlink -> file1     #该软链接大小为5个字节,和真实文件名长度相同。

软链接的主要特点如下:

  1. 可以跨分区创建软链接;
  2. 可以对目录或文件创建软链接;
  3. 创建软链接时,链接数不会增加;
  4. 删除原文件,则软链接会失效,称为死链接,重新创建原文件,死链接可以恢复为正常的软链接;
  5. 软链接文件有自己的inode,block,独立的文件权限和属性;
  6. 可以对不存在的文件或目录创建软链接;

软链接的用途较为广泛,以下为实际使用的两个场景:

  • 代码发布
  • 软件版本升级

  • #1.网站代码v1.1版本:
    root@xuzhichao data]# mkdir python-v1.1
    [root@xuzhichao data]# echo "v1.1" > python-v1.1/index.html
    [root@xuzhichao data]# cat python-v1.1/index.html
    v1.1
    
    #2.创建软链接
    [root@xuzhichao data]# ln -s python-v1.1/ python
    [root@xuzhichao data]# ll /data/
    total 0
    lrwxrwxrwx 1 root root 12 May 16 16:14 python -> python-v1.1/
    drwxr-xr-x 2 root root 24 May 16 16:14 python-v1.1
    
    #3.更新网站代码v1.2
    [root@xuzhichao data]# mkdir python-v1.2
    [root@xuzhichao data]# echo "v1.2" > python-v1.2/index.html
    [root@xuzhichao data]# cat python-v1.2/index.html
    v1.2
    
    #4.升级代码到v1.2
    [root@xuzhichao data]# rm -f python && ln -s python-v1.2/ python
    [root@xuzhichao data]# cat python/index.html 
    v1.2
    
    #5.升级失败回退到v1.1
    [root@xuzhichao data]# rm -f python && ln -s python-v1.1/ python
    [root@xuzhichao data]# cat python/index.html 
    v1.1
    
posted @ 2021-05-16 19:02  向往自由的独行者  阅读(437)  评论(0编辑  收藏  举报