• 09Linux之文件管理


    09Linux之文件管理

    9 文件管理

    9.1 命令

    9.1.1 pwd

    • 查看当前所在的目录

    9.1.2 cd

    • 切换目录

      # 切换目录
      cd 绝对路径  例如:cd /home/alice  等同于cd ~alice
      cd 相对路径  例如:cd home/alice
      cd -  		# 返回上次目录
      cd  		# 直接回家目录,等同于cd ~
      cd .  		# 保持当前目录不变
      cd ..  		# 切换到当前目录的上一级目录
      

    9.1.3 ls

    • 浏览

      ls  			 # 默认浏览当前目录
      ls -l 目录  		# 即ll,浏览目录下的子目录及子文件名的详细信息
      ls -a 目录  		# 浏览所有目录下所有文件,包括隐藏文件
      ls -al 目录  		# 浏览结果包括隐藏文件
      ls -dl 目录  		# 查看目录
      

    9.1.4 tree

    • 查目录树:需先安装tree命令,执行yum install tree -y

      # 常用命令
      tree -a 目录  		# 显示所有文件,包括隐藏文件
      tree -d 目录  		# 只显示子目录
      tree -L 1 目录  		# —L:遍历目录的最大层数,后接大于0整数
      tree -F 目录  		# -F在条目后加上文件类型的指示符(如目录后加/)
      # 其他命令
      -C  # 在文件和目录清单上加色彩,便于区分各种类型
      -r  # 不显示符合范本样式的文件或目录名称
      -P  # 只显示符合范本样式的文件或目录名称
      -s  # 列出文件或目录的大小
      -f  # 在每个文件或目录前,显示完整的相对路径名称
      -t  # 以文件或目录的更改时间排序
      

    9.2 增删改查

    9.2.1 创建(touch、mkdir)

    • 创建文件 touch

      ============================创建文件touch==========================
      # 创建单个文件
      touch file1.txt  			 # 无则创建,有则更新时间(相对路径)
      touch /boot/file1.txt   		 # 无则创建,有则更新时间(绝对路径)
      
      # 创建多个文件
      touch a.txt b.txt c.txt 		 # (以空格分开)创建a.txt b.txt c.txt
      touch file{1..3}.py  			 # (以{}创建)创建file1.py file2.py file3.py
      touch c{j,J}x.py  			 # 创建cjx.py cJx.py
      touch {1..2}{a..b}.txt    		 # 创建1a.txt 1b.txt 2a.txt 2b.txt
      
      # 修改文件时间 -t  # stamp
      touch -t 2011111111 2020.rmvb            # 用[[CC]YY]MMDDhhmm[.ss]代替现在的时间
      
    • 创建目录 mkdir

      ============================创建目录mkdir==========================
      # 创建单个目录
      mkdir dir1  			   # 创建目录dir1(相对路径)
      nkdir /home/dir2  	 	   # 创建目录dir2(绝对路径)
      
      # 创建多个目录
      mkdir dir3 dir4  		   # 创建目录dir3 dir4(相对路径,以空格分隔)
      nkdir /home/dir5 /home/dir6        # 创建目录dir5 dir6(绝对路径,以空格分隔)
      mkdir /home/{dir7,dir8}  	   # 创建目录dir7 dir8
      
      # 显示结果 -v
      mkdir -v /home/{dir9,dir10}
      	mkdir:已创建目录 "/home/dir9"
          mkdir:已创建目录 "/home/dir10"
      
      # 递归创建 -p
      mkdir -p a/b/c/d  		   # a目录不存在
      

    9.2.2 删除(rm)

    • 删除 rm

      # 例如:删除/home/dir1
      cd /home
      rm -rf dir1
      或者rm -rf /home/dir1
      
      # rm -rf常见用法
      -r  	# 递归(即可以删目录)
      -f  	# force强制
      *  	# 删除该目录下所有内容
      /* 	# 删根
      -i  	# 交互
      -v  	# 详细过程
      

    9.2.3 复制(cp)

    • 复制 cp 源文件 目标文件

      # 常见用法
      cp -v  # 显示过程
      cp -r  # 复制目录
      cp -a  # 保留源文件或目录的属性,包括所有者、所属组、权限和时间(同-p)
      cp -f  # 强行复制文件或目录,不论目的文件或目录是否已经存在
      cp -i  # 交互,覆盖文件之前先询问用户
      cp -u  # 只会在源文件的修改时间较目标文件更新时,或目标文件不存在时才复制文件
      
      # 示例
      cp -r /boot/* /test/  		# 将boot目录下所有文件复制到/test/目录下
      cp -a /home/cjx/a.py /mnt/   	# 将用户cjx家目录下的a.py复制到root的/mnt目录下且保留a.py的属性
      cp -f /test/a.txt /test1/a.txt  # 强制将/test/a.txt覆盖/test1/a.txt
      # 具体步骤为
      # 1、先执行rm -rf /test1/a.txt
      # 2、再执行cp /test/a.py /test1/
      
      # 拓展
      !$  # 上条命令最后一个参数
      su  # 切换用户
      cp -rfv /etc/hosts{,.old}  		# 将hosts在源路径下再复制一份hosts.old
      
      # >用法以及>>用法
      echo "111" > /opt/a.py  		# 将111覆盖到/opt/a.py
      echo "222" >> /opt/a.py  		# 将222追加到/opt/a.py的后面
      

    9.2.4 移动(mv)

    • 相当于剪切

      # 用法
      mv 源地址 目标地址
      
      # 示例
      mv file1 /home/dir2  	# 将file1移动到/home/dir2目录下
      mv file3 file4  	# 将file3重命名为file4(当前位置的移动就是重命名)
      

    9.3 查看文件内容

    9.3.1 常用文本文件

    • cat、less、more、head、tail、grep

      /etc/hosts
      /etc/sysconfig/network
      /etc/sysconfig/network-scripts/ifcfg-eth0
      /etc/passwd
      /etc/shadow
      /etc/group
      /etc/grub.conf
      /etc/resolv.conf
      /var/log/messages  # 系统的主日志文件
      

    9.3.2 cat

    • cat命令用于连接文件并打印到标准输出设备上(即查看)

      # 常见命令
      -n  # --number 由1开始对所有输出的行数编号
      -b  # --number-nonblank 不对空白行编号
      -s  # --squeeze-blank 当遇到连续两行以上空白行时,替换为一行空白行
      -v  # --show-nonprinting 使用^和M-符号,除了LFD和TAB之外
      -E  # --show-ends 在每行结尾处显示$
      -T  # --show-tabs 将TAB字符显示为^l
      -A  # --show-all 等价于-vET
      -e  # 等价于-vE
      -t  # 等价于-vT
      
      # 拓展
      unix2dos file1  # 将文件file1的格式从Unix格式转换为Windows格式
      dos2unix file2  # 将文件file2的格式从Windows格式转换为unix格式
      

    9.3.3 less、more、head、tail

    • 常规用法

      ===============================head用法==============================
      head /etc/passwd		# 查看passwd文件的前十行(默认十行)
      head -n 2 /etc/passwd	        # 查看前两行(也可写成head -2 /etc/passwd)
      
      ===============================tail用法==============================
      tail /etc/passwd 	 	# 查看passwd文件最后十行(默认十行)
      tail -n 2 /etc/passwd		# 查看最后两行(也可写成tail -2 /etc/passwd)
      tail -f /var/log/messages       # 动态查看文件的尾部
      logger yangsheng  		# 手动产生日志信息
      
      ===============================more用法==============================
      more /etc/passwd  		# 每次屏幕上显示一屏(一页)内容且底部出现"-More-(n%)"
      # more命令使用空格向下翻页,b向上翻页
      more +40 a.txt  		# 表示从第四十行开始查看a.txt
      
      ===============================less用法==============================
      less /etc/passwd  		# 屏幕每次显示一屏(一页)按下键显示下一行
      
      ===============================组合用法==============================
      tail -4 a.txt | head -2         # 查看a.txt的倒数第四和倒数第三行
      

    9.3.4 grep

    • 针对文件内容进行过滤

      grep 'root' /etc/passwd  		 # 在/etc/passwd中筛选有root的行
      grep --color 'root' /etc/passwd  	 # 用颜色在/etc/passwd中筛选有root的行
      grep --color '^root' /etc/passwd  	 # 用颜色在/etc/passwd中筛选以root开头的行
      grep --color 'root$' /etc/passwd  	 # 用颜色在/etc/passwd中筛选以root结尾的行
      
      # 二进制文件(string grep)
      strings /bin/ls
      

    9.4 修改文件内容vim

    9.4.1 vim编辑

    • vim基础

      # 什么是vim
      vim是vi发展出来的一个文本编辑器(vi iMproved)。没有菜单,只有命令
      
      # vim的作用
      修改配置、写脚本
      
      # vi与vim区别
      vi不显示高亮颜色语法,vim显示高亮语法
      vi默认安装,vim需要yum install vim -y来安装
      
    • vim三种模式

      # 三种模式
      命令模式、输入模式、末行模式
      
      # 三种模式切换方式
      =====================命令模式-->输入模式=======================
      
      a-->光标所在处后面一个字符开始输入  A-->光标所在行行尾开始输入
      i-->光标所在处前面一个字符开始输入  I-->光标所在行行首开始输入
      o-->光标所在处的下另起一行开始输入  O-->光标所在处上面另起一行开始输入
      
      =====================命令模式-->末行模式=======================
      
      按下":"
      
      ===================输入、末行模式-->命令模式=====================
      
      按下"Esc"键
      
      --------------------------over-------------------------------
      
      # 三种模式的用法
      ==========================命令模式============================
      
      # 光标的移动
      0  	# 光标移动到当前行的行首
      $  	# 光标移动到当前行的行尾
      gg  	# 光标移动到首行的行首
      G       # 光标移动到末行的行首
      nG  	# (ngg)n为数字,光标移动感到第n行(20G/20gg就是移动到第20行行首)
      H  	# 光标移动到当前界面的首行的行首
      M 	# 光标移动到当前界面的中间行的行首
      L  	# 光标移动到当前界面的末行的行首
      ^  	# 光标移动到该行第一个非空字符
      h  	# 光标往左移一个字符(←)
      j  	# 光标向下移一个字符(↓)
      k  	# 光标向上移一个字符(↑)
      l  	# 光标向右移一个字符(→)
      zz  	# 将光标所在行居屏幕的中央
      zt  	# 将光标所在行居屏幕最上行
      CTRL+f  # forword向下翻页(PgUp)
      CTRL+b  # backword向前翻页(PgDn)
      CTRL+d  # 向下翻半页
      CTRL+u  # 向上翻半页
      CTRL+e  # 向下滚一行
      CTRL+y  # 向上滚一行
      
      # 文本编辑
      d  		# 删除、剪切 dd 3dd dgg dG
      y  		# 复制 yy 3yy ygg yG
      p  		# 粘贴到下一行
      np 		# n为次数,5p就是粘贴五次
      P  		# 粘贴到上一行
      x  		# 删除光标所在字符
      D  		# 从光标处删除至行尾
      r  		# 修改光标所在字符
      u  		# undo撤回
      CTRL+r   # 撤销撤回
      
      # 进入其他模式
      a、i、o、A、I、O  #进入编辑模式
      :  		 # 进入末行模式
      CTRL+v  	 # 进入可视块模式
      R  		 # 进入替换模式
      
      # 可视块
      # 批量加注释
      1、光标移动到需要被注释的行的行首
      2、CTRL+v进入可视块模式,方向键选择选中
      3、shift+i编辑,按#
      4、连续按两次'Esc'
      # 批量去注释
      1、光标移动到需要去掉注释的行的行首
      2、CTRL+v进入可视块模式,方向键选择好#
      3、按'd'删除
      
      # 查找内容
      /需要查找的内容  # n在查找结果中顺着走,N在查找结果中倒着走,可循环。5n即跳到光标下第五个查找结果
      
      ==========================输入模式============================
      
      CTRL+p  # 同CTRL+n 自动补全命令(相当于Tab)
      例如上文输入过ifconfig,下文输入if按ctrl+p/n可自动补全为ifconfig
      上文如果输入过print、prend,下文输入pr按ctrl+p/n时可选择补全为print或prend
      
      ==========================末行模式============================
      
      # 保存退出
      :10  # 进入第十行
      :w   # 保存
      :q   # 退出(:q!强制退出)
      :wq  # 保存退出(:wq!强制保存退出)
      :x   # 保存退出
          
      # 查找替换  :范围 s/xxx/yyy/选项
      :1,5 s/xxx/yyy/   # 表示1~5行的首个xxx改为yyy
      :2,$ s/xxx/yyy/   # 2~最后一行的首个xxx改为yyy
      :1,5 s/xxx/yyy/g  # 表示1~5行的全部xxx改为yyy
      :% s/xxx/yyy/     # 表示全文的首个xxx替换为yyy(%:所有行,g:一整行)
      :% s/^xxx$/yyy/g  # 表示以xxx开头且以xxx为结尾的替换为yyy
          
      # 读入文件/写文件
      :w /aaa.py     # 另存为aaa.py
      :1,3 w/2.txt   # 将1~3行另存到2.txt
      :r /etc/hosts  # 将etc/hosts插入到光标下一行
      
      --------------------------over-------------------------------
      

    9.4.2 设置环境

    • 临时设置

      :set nu    # 设置行号
      :set ic    # 不区分大小写 
      :set ai    # 自动缩进
      :set list  # 用$标识行尾
      :set nonu  # 取消设置行号
      :set noic  # 取消不区分大小写
      :set noai  # 取消自动缩进
      
    • 永久配置

      /etc/vimrc  # 影响所有系统用户
      ~/.vimrc    # 影响某一个用户(在家目录下新增一个文件)
      输入set ic以及set nu
      

    9.4.3 同时编辑多文件

    • 同时编辑多个文件

      # 用CTRL+ww切换
      vim -o 文件1 文件2  # 水平分隔
      vim -O 文件1 文件2  # 垂直分隔
      
      # 用PgUp、PgDn或者gt、gT切换
      vim -p 文件1 文件2
      

    9.4.4 文件内容对比

    • 相同文件之间差异对比,通常用于对比修改前后的差异

      diff  				# 文件对比
      vimdiff  			# 以vim方式打开两个文件对比,高亮显示不同的内容
      vimdiff 文件1 文件2             # 用CTRL+ww切换
      

    9.4.5 vim保护机制

    • 遇到故障意外退出时,会保存.swp文件,再次编辑时会提示
    • 删除临时文件或先恢复内容再删除(-r选项进行恢复)来解决故障

    9.4.6 打补丁

    • 打补丁

      创建1.py和2.py两个文件(1基础版2修改版)
      diff -u 1.py 2.py > a.diff  # 以2.py为标准的补丁文件
      diff -u 2.py 1.py > b.diff  # 以1.py为标准的补丁文件
      patch 1.py a.diff  # 将1.py修改成与2.py一样(a补丁打入1.txt)
      patch 1.py b.diff  # 将新的1.py修改回原本的1.py
      

    9.5 文件处理三剑客(支持|)

    9.5.1 sed流式编辑器

    • 事先制定好编辑文件的指令,让sed自动完成对文件的整体编辑(同一时间内存中只有文件中一条)

      # 用法
      sed 选项 '定位 + 命令' 文件路径
      
      # 选项
      -n  # 取消默认输出
      -i  # 取消输出流向(将输出到屏幕中的内容流向文件即立即编辑文件)
      
      # 定位
      行定位:
          1定位到第一行
          1,3代表从第一行到第三行
          不写定位代表定位到所有行
      正则表达式定位:
          /ccc/   # 包含ccc的行
          /^ccc/  # 以ccc开头的行
          /ccc$/  # 以ccc结尾的行
      数字+正则表达式定位
          "1,8p" 	  # 代表打印第一到第八行
          "1,/ccc/p"    # 代表取从第一行到首次匹配到/ccc/的行
          
      # 命令
      d 	    # 删除
      p  	    # 打印
      s///gi      #查找替换,s表示所有行,g表示一整行,i表示不区分大小写
      命令可以用";"来连接多条,如1d;3d;5d代表删除1,3,5行
      
      ================================================
      [root@ccc ~]# cat a.txt 
      ccc
      111ccc
      111ccc111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      # i在第二行上面加上222,a是在下面
      [root@ccc ~]# sed '2i 222' a.txt  
      ccc
      222
      111ccc
      111ccc111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# 
      
      =====================p的用法=====================
      [root@ccc ~]# sed '' a.txt 
      ccc
      111ccc
      111ccc111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# sed -n '' a.txt 
      [root@ccc ~]# 
      [root@ccc ~]# sed -n '1,/111ccc111/p' a.txt 
      ccc
      111ccc
      111ccc111
      [root@ccc ~]#
      
      =====================d的用法=====================
      [root@ccc ~]# cat a.txt 
      ccc
      111ccc
      111ccc111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# sed '1,/111ccc111ccc/d' a.txt 
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# sed '1d;3d;5d;7d' a.txt 
      111ccc
      ccc111ccc
      111Ccc
      [root@ccc ~]#
      
      =====================s///gi的用法=====================
      
      [root@ccc ~]# cat a.txt 
      ccc
      111ccc
      111ccc111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# sed 's/ccc/yyy/g' a.txt   # 将所有行所有ccc改为yyy
      yyy
      111yyy
      111yyy111
      yyy111yyy
      111yyy111yyy
      111Ccc
      CcC111cCc111yyy
      [root@ccc~]#sed 's/ccc/yyy/gi' a.txt # 将所有行所有ccc(不区分大小写)改为yyy
      yyy
      111yyy
      111yyy111
      yyy111yyy
      111yyy111yyy
      111yyy
      yyy111yyy111yyy
      [root@ccc~]#sed '/^ccc/s/111/222/g' a.txt #将所有以ccc开头的行的111改为222
      ccc
      111ccc
      111ccc111
      ccc222ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# sed '1,3s/ccc/zzz/g' a.txt #将1~3行的ccc改为zzz
      zzz
      111zzz
      111zzz111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# 
      
      =====================sed搭配管道|的用法=====================
      [root@ccc ~]# cat a.txt 
      ccc
      111ccc
      111ccc111
      ccc111ccc
      111ccc111ccc
      111Ccc
      CcC111cCc111ccc
      [root@ccc ~]# cat a.txt | sed '2,6d'  # 将a.txt的2~6行删掉
      ccc
      CcC111cCc111ccc
      [root@ccc ~]#
      

    9.5.2 awk

    • 处理有规律的文本,做一些格式化处理(awk实际上是一门编程语言)

    • 例如/etc/passwd这种

      # 用法
      awk 选项 'pattern{action}' 文件路径
      
      # 选项
      -F  # 指定分隔符(后面可以接,: 等)
      不加默认以空格分隔  # 连续空格视为1个
      
      # awk -F:'{print $1,$3}' /etc/passwd的工作流程
      1、awk会读取文件的一行内容然后赋值给$0
      2、awk会以-F指定的分隔符将该段切分成n段(最多100段),第一段给$1,第二段给$2,依次递推
      3、print输出该行的第一第三段(逗号表示输出分隔符,默认与-F保持一致)
      4、重复123直到文件内容读完
      
      # 内置变量
      $0  # 一整行内容
      NR  # 记录号,等同于行号
      NF  # 以-F分隔符分割的段数
      
      # pattern的种类
      正则
          /正则/  		# 该行内容匹配成功正则
          $1 ~ /正则/  	# 第一段内容匹配成功正则
          $1 !~ /正则/        # 第一段内容没有匹配成功正则
      比较运算
          NR >= 3 && NR <= 5  # 3~5行
          $1 == "root"        # 第一段内容等于root
      
      # action的类型
      print $1,$3
      
      =====================用法示例=====================
      [root@ccc ~]# cat 1.py
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/sbin/nologin
      daemon:x:2:2:daemon:/sbin:/sbin/nologin
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
      # 以root开头的行打印第一段和第三段
      [root@ccc ~]# awk -F: '/^root/{print $1,$3}' 1.py
      root 0
      # 第一段内容以d开头的打印第一和第三段
      [root@ccc ~]# awk -F: '$1 ~ /^d/{print $1,$3}' 1.py 
      daemon 2
      # 第一段内容不是以d开头的打印第一和第三段(取反)
      [root@ccc ~]# awk -F: '$1 !~ /^d/{print $1,$3}' 1.py
      root 0
      bin 1
      adm 3
      lp 4
      # 第四行以后的行打印第一段
      [root@ccc ~]# awk -F: 'NR>4{print $1}' 1.py 
      lp
      # 第一段内容是root的,打印整行
      [root@ccc ~]# awk -F: '$1 == "root"{print $0}' 1.py 
      root:x:0:0:root:/root:/bin/bash
      # awk支持管道
      [root@ccc ~]# cat 1.py | awk -F: '{print $1}'
      root
      bin
      daemon
      adm
      lp
      [root@ccc ~]#
      

    9.5.3 grep

    • 从一堆杂乱无章的内容中过滤

      # 用法
      grep 选项 '正则' 文件路径
      
      # 选项
      -n  # --line-number 在过滤出的每行前面加上他在文件中的相对行号
      -i  # --ignore-case 忽略大小写
      --color  # 颜色
      -l  # --files-with-matches 如果匹配成功,则将文件名打印出来,失败不打印
      -r  # --recursive  递归,在查找的文件夹下寻找,匹配成功返回文件名,失败不打印
      通常-rl一起用  grep -rl 'rppt' /etc
      
      =====================用法示例=====================
      [root@ccc ~]# grep 'root' /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      operator:x:11:0:operator:/root:/sbin/nologin
      [root@ccc ~]# grep -n 'bash$' /etc/passwd
      1:root:x:0:0:root:/root:/bin/bash
      [root@ccc ~]# grep -rl 'bash$' /etc
      /etc/pki/tls/certs/renew-dummy-cert
      /etc/crontab
      /etc/libuser.conf
      
      =====================管道|========================
      [root@ccc ~]# ps aux |grep ssh  # 查看包含ssh的进程
      root        802  0.0  0.4 112924  4328 ?        Ss   10:06   0:00 /usr/sbin/sshd -D
      root       1483  0.0  0.6 161536  6092 ?        Ss   14:33   0:00 sshd: root@pts/0
      root       1851  0.0  0.0 112824   980 pts/0    R+   19:52   0:00 grep --color=auto ssh
      [root@ccc ~]# ps aux |grep [s]sh  # 不包括刚输命令的进程
      root        802  0.0  0.4 112924  4328 ?        Ss   10:06   0:00 /usr/sbin/sshd -D
      root       1483  0.0  0.6 161536  6092 ?        Ss   14:33   0:00 sshd: root@pts/0
      [root@ccc ~]# 
      

    9.6 文件查找命令find

    9.6.1 基本命令

    • find [path] [-option] [expression]

    9.6.2 基本用法

    • 基础

      # 按文件名 -name
      [root@ccc ~]# find /etc -name 'ifcfg-ens33'
      /etc/sysconfig/network-scripts/ifcfg-ens33  # 查找ifcfg-ens33
      [root@ccc ~]# find /etc -name 'ifcfg-*'
      /etc/sysconfig/network-scripts/ifcfg-lo
      /etc/sysconfig/network-scripts/ifcfg-ens33
      /etc/sysconfig/network-scripts/ifcfg-ENS33  # 查找以ifcfg开头的文件
      [root@ccc ~]# find /etc/ -iname 'ifcfg-ens33'
      /etc/sysconfig/network-scripts/ifcfg-ens33
      /etc/sysconfig/network-scripts/ifcfg-ENS33  # i不区分大小写
      
      # 按文件大小 -size
      [root@ccc ~]# 
      [root@ccc ~]# find /etc -size +5M  # 大于5M的文件
      /etc/udev/hwdb.bin
      [root@ccc ~]# find /etc -size 3M  # 等于3M的文件
      [root@ccc ~]# find /etc -size -1k  # 小于1k的文件
      /etc/crypttab
      /etc/pki/ca-trust/extracted/pem/objsign-ca-bundle.pem
      /etc/environment
      /etc/exports
      /etc/motd
      /etc/sysconfig/network-scripts/ifcfg-ENS33
      [root@ccc ~]# find /etc -size +3M -ls  # -ls找到的处理动作
          70 8188 -r--r--r--   1 root     root      8384358 10月 16 12:32 /etc/udev/hwdb.bin
      8809555 3816 -rw-------   1 root     root      3905267 4月  1  2020 /etc/selinux/targeted/active/policy.kern
      13347359 3816 -rw-r--r--   1 root     root      3905267 4月  1  2020 /etc/selinux/targeted/policy/policy.31
      
      # 指定查找的目录深度 -maxdepth levels
      [root@ccc ~]# find / -maxdepth 5 -a -name 'ifcfg-ens33'
      /etc/sysconfig/network-scripts/ifcfg-ens33
      /test/ifcfg-ens33  # -a并且,-o或者,不加-a默认就是-a
      
      # 按时间找 -atime -mtime -ctime
      [root@ccc ~]# find . -mtime +15  # 修改时间超过15天
      ./.bash_logout
      ./.bash_profile
      ./.bashrc
      ./.cshrc
      ./.tcshrc
      ./Python-2.7.18.tgz
      ./1.jpg
      [root@ccc ~]# find . -mtime 1  # 修改时间等于1天
      [root@ccc ~]# find . -mtime -3  # 修改时间3天以内
      .
      ./.bash_history
      ./t.txt
      ./f.txt
      ./1.py
      ./.viminfo
      ./a.txt
      
      # 按文件属主、属组找 -user -group
      [root@ccc ~]# find /home -user lili  # 属主是lili的文件
      /home/lili
      /home/lili/.bash_logout
      [root@ccc ~]# find /home -group lili  # 数组是lili的文件
      /home/lili
      /home/lili/.bash_logout
      [root@ccc ~]# find /home -user lili -a -group lili  # 属主lili且数组lili的文件
      /home/lili
      /home/lili/.bash_logout
      [root@ccc ~]# find /home -user lili -group lili  # 同上-a
      /home/lili
      /home/lili/.bash_logout
      [root@ccc ~]# find /home -user lili -o -group lili  # 属主lili或数组lili的文件
      /home/lili
      /home/lili/.bash_logout
      
      [root@ccc ~]# su - lili  # 切换到lili用户
      [lili@ccc ~]$ touch 111.txt  # 创建111.txt
      [lili@ccc ~]$ exit
      登出
      [root@ccc ~]# ll /home/lili/111.txt 
      -rw-rw-r-- 1 lili lili 0 10月 26 14:34 /home/lili/111.txt
      [root@ccc ~]# vim /etc/group
      [root@ccc ~]# find /home -nogroup -ls # 用户还存在,在/etc/group删除了记录
      8494233    0 drwx------   2 lili     1000           98 10月 26 14:34 /home/lili
      8494238    4 -rw-r--r--   1 lili     1000           18 4月  1  2020 /home/lili/.bash_logout
      8494239    4 -rw-r--r--   1 lili     1000          193 4月  1  2020 /home/lili/.bash_profile
      8493577    4 -rw-r--r--   1 lili     1000          231 4月  1  2020 /home/lili/.bashrc
      8493579    0 -rw-rw-r--   1 lili     1000            0 10月 26 14:34 /home/lili/111.txt
      8493580    4 -rw-------   1 lili     1000           19 10月 26 14:34 /home/lili/.bash_history
      
      [root@ccc ~]# find /home -nouser -ls
      8494233    0 drwx------   2 1000     1000           98 10月 26 14:34 /home/lili
      8494238    4 -rw-r--r--   1 1000     1000           18 4月  1  2020 /home/lili/.bash_logout
      8494239    4 -rw-r--r--   1 1000     1000          193 4月  1  2020 /home/lili/.bash_profile
      8493577    4 -rw-r--r--   1 1000     1000          231 4月  1  2020 /home/lili/.bashrc
      8493579    0 -rw-rw-r--   1 1000     1000            0 10月 26 14:34 /home/lili/111.txt
      8493580    4 -rw-------   1 1000     1000           19 10月 26 14:34 /home/lili/.bash_history
      
      [root@ccc ~]# find /home -nouser -ls -o -nogroup -ls
      8494233    0 drwx------   2 1000     1000           98 10月 26 14:34 /home/lili
      8494238    4 -rw-r--r--   1 1000     1000           18 4月  1  2020 /home/lili/.bash_logout
      8494239    4 -rw-r--r--   1 1000     1000          193 4月  1  2020 /home/lili/.bash_profile
      8493577    4 -rw-r--r--   1 1000     1000          231 4月  1  2020 /home/lili/.bashrc
      8493579    0 -rw-rw-r--   1 1000     1000            0 10月 26 14:34 /home/lili/111.txt
      8493580    4 -rw-------   1 1000     1000           19 10月 26 14:34 /home/lili/.bash_history
      
      # 按文件类型 -type
      [root@ccc ~]# find /dev -type f  # f普通
      [root@ccc ~]# find /dev -type d  # d目录
      [root@ccc ~]# find /dev -type l  # l链接
      [root@ccc ~]# find /dev -type b  # b块设备
      [root@ccc ~]# find /dev -type c  # c字符设备
      [root@ccc ~]# find /dev -type s  # s套接字
      [root@ccc ~]# find /dev -type p  # p管道文件
      
      # 根据inode号查找 -inum n
      [root@ccc ~]# find / -inum 1811
      
      # 按文件权限 -perm
      [root@ccc ~]# find . -perm 644 -ls
      
      
    • 后续处理

      -print
      -ls
      -delete
      -exec
      -ok
      
      # -exec非交互
      [root@ccc ~]# find /etc/ -name "ifcfg-*" -exec cp -rvf {} /tmp ;
      "/etc/sysconfig/network-scripts/ifcfg-lo" -> "/tmp/ifcfg-lo"
      "/etc/sysconfig/network-scripts/ifcfg-ens33" -> "/tmp/ifcfg-ens33"
      "/etc/sysconfig/network-scripts/ifcfg-ENS33" -> "/tmp/ifcfg-ENS33"
      # -ok交互
      [root@ccc ~]# find /etc/ -name "ifcfg-*" -ok cp -rvf {} /tmp ;
      < cp ... /etc/sysconfig/network-scripts/ifcfg-lo > ? y
      "/etc/sysconfig/network-scripts/ifcfg-lo" -> "/tmp/ifcfg-lo"
      < cp ... /etc/sysconfig/network-scripts/ifcfg-ens33 > ? y
      "/etc/sysconfig/network-scripts/ifcfg-ens33" -> "/tmp/ifcfg-ens33"
      < cp ... /etc/sysconfig/network-scripts/ifcfg-ENS33 > ? y
      "/etc/sysconfig/network-scripts/ifcfg-ENS33" -> "/tmp/ifcfg-ENS33"
      
      # 删除的一种用法
      [root@ccc ~]# find /etc/ -name "ifcfg-*" -exec rm -rf {} ;
      [root@ccc ~]# find /etc/ -name "ifcfg-*" -delete
      
    • 拓展:find用管道必须结合xargs

      [root@ccc ~]# find . -name 'cjx*.txt' |xargs rm -rf  # 删除的另一种方式
      
      [root@ccc ~]# find /etc/ -name 'ifcfg-ens33' |xargs -I {} cp -rf {} /var/tmp/
      [root@ccc ~]# ll /var/tmp/
      总用量 1
      -rw-r--r-- 1 root root 262 10月 26 15:07 ifcfg-ens33
      
      [root@ccc ~]# find /test -name 'ifcfg-ens33' | xargs -I {} mv {} /ttt
      
      

    9.7 文件的上传与下载

    9.7.1 下载

    • wget命令

      # 将远程包下载到本地,-O指定下载到哪里,也可省略-O 本地路径
      wget -O 本地路径 远程包链接地址
      [root@ccc ~]# wget -O ./2.jpg http://pic17.nipic.com/20111115/8754739_105205490111_2.jpg
      
      # 如果wget下载提示无法建立SSL连接,需加上选项--no-check-certificates
      [root@ccc ~]# wget --no-check-certificate -O ./2.jpg http://pic17.nipic.com/20111115/8754739_105205490111_2.jpg
      
      
    • curl命令

      # curl命令是一个利用URL规则在命令行下工作的文件传输工具
      # 支持文件的上传和下载,是综合传输工具,按传统称curl为下载工具
      # wget会将下载的内容直接打印在屏幕上
      
      [root@ccc ~]# curl -O ./3 https://tiyu.baidu.com/match/S10/tab/赛程
        % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
        0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0curl: 
      
      # 如果遇到下载提示无法建立SSL连接,使用-k选项或者--insecure
      [root@ccc ~]# curl -k -O ./3 https://tiyu.baidu.com/match/S10/tab/赛程
      
    • sz命令

      # 系统默认没有sz命令,需下载yum install -y lrzsz
      # 将服务器上选定的文件下载/发送到本机
      [root@ccc ~]# sz 1.jpg
      

    9.7.2 上传

    • rz

      # 系统默认没有rz命令,需下载yum install lrzsz -y
      # 运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器
      [root@ccc ~]# rz  # 如果文件已经存在,则上传失败,可以用-E选项解决
      [root@ccc ~]# rz -E  # -E如果目标文件名已存在,则重命名传入文件。新文件名多一个点或一个数字(0..999)
      

    9.8 输出与重定向

    9.8.1 基本概念

    • 几种情况

      # 输出即把相关对象通过输入设备(显示器等)显示出来
      # 输出分为正确输出和错误输出
      # 一般情况下输出设备为显示器
      # 标准输入设备为键盘
      
      0  # 标准输出
      1  # 标准正确输出
      2  # 标准错误输出
      

    9.8.2 输出重定向

    • > # 覆盖

    • >> # 追加

      # 正常输出是把内容输出到显示器上
      # 输出重定向是把内容输出到文件中
      
      # 标准输出重定向(1可以省略)
      命令>文件  	# 以覆盖的形式把命令的正确输出输出到指定的文件或设备当中
      命令>>文件       # 以追加的方式把命令的正确输出输出到指定的文件或设备中
      
      # 标准错误输出重定向
      错误命令 2>文件  # 以覆盖的形式把命令的错误输出输出到指定的文件或设备中
      错误命令 2>文件  # 以追加的方式把命令的错误输出输出到指定的文件或设备中
      
      # 例子
      ifconfig>test.log  # 把ifconfig执行显示的正确内容写入test.log当前界面不再显示执行结果
      # 错误输出重定向>与>>后面不能加空格
      
      # 正确输出与错误输出同时保存
      命令>文件 2>&1  	         # 以覆盖的方式把正确输出和错误输出都保存到同一个文件夹中
      命令>>文件 2 >&1  	 # 以追加的方式把正确输出和错误输出都保存到同一个文件中
      命令 &>文件  		 # 以覆盖的方式把正确输出和错误输出都保存到同一个文件中
      命令 &>>文件  		 # 以追加的方式把正确输出和错误输出都保存到同一个文件夹中
      命令>>文件1 2>>文件2      # 把正确的输出追加到文件1中,把错误的输出追加到文件2中
      
      # 注意
      命令 >>file.log 2>&1  与  命令 &>>file.log  # 命令作用相同
      命令 >>file.log 2>>file2.log               # 正确日志和错误日志分开保存
      ls &>/dev/null  			   # 系统常见用法,正确输出或错误输出都不要(null理解为黑洞或垃圾站)
      
      

    9.8.3 输入重定向

    • cat >目标文件<内容来源(源文件地址):也可以写成cat<内容来源>目标文件(将源文件内容写至目标文件)
    • cat >目标文件<<EOF(键盘输入,最后以EOF结尾)将键盘输入内容写入目标文件,也可以写成cat<<EOF>目标文件

    9.9 字符处理命令

    9.9.1 sort排序

    • 用于将文件内容加以排序(默认以字符串的字符编码从小到大排序)

      -n # 依照数值的大小排序

      -r # 以相反的顺序来排序

      -k # 以某列进行排序

      -t # 指定分隔符,默认是空格

      [root@ccc ~]# cat a.py 
      b:3
      c:2
      a:4
      4:1
      f:5
      [root@ccc ~]# sort a.py 
      4:1
      a:4
      b:3
      c:2
      f:5
      [root@ccc ~]# sort -t ":" -n -k2 a.py 
      4:1
      c:2
      b:3
      a:4
      f:5
      [root@ccc ~]# sort -t ":" -n -r -k2 a.py 
      f:5
      a:4
      b:3
      c:2
      4:1
      

    9.9.2 uniq去重

    • 用于检查及删除文本文件中重复出现的行列,一般与sort命令结合使用

      -c # 在每列旁边显示出该行重复出现的次数

      -d # 仅显示重复出现的行列

      -u # 仅显示出现一次的行列

      [root@ccc ~]# cat b.py 
      hello
      123
      hello
      123
      hahaha
      [root@ccc ~]# sort b.py   # sort默认以字符串的字符编码从小到大排序
      123
      123
      hahaha
      hello
      hello
      [root@ccc ~]# sort b.py |uniq  # 去重
      123
      hahaha
      hello
      [root@ccc ~]# sort b.py | uniq -c  # 在每列旁边显示出该行重复出现的次数
            2 123
            1 hahaha
            2 hello
      [root@ccc ~]# sort b.py | uniq -d  # 仅显示重复出现的行列
      123
      hello
      [root@ccc ~]# sort b.py | uniq -u  # 仅显示出现一次的行列
      hahaha
      

    9.9.3 cut处理规律文本

    • 用来显示行中的指定部分,删除文件中指定字段

      -d # 指定字段的分隔符,默认是"TAB"

      -f # 显示指定字段的内容

      [root@ccc ~]# head -1 /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      [root@ccc ~]# head -1 /etc/passwd | cut -d ":" -f1
      root
      [root@ccc ~]# head -1 /etc/passwd | cut -d ":" -f1-3
      root:x:0
      [root@ccc ~]# head -1 /etc/passwd | cut -d ":" -f1,3
      root:0
      

    9.9.4 tr替换

    • 替换或删除命令

      -d # 删除字符

      [root@ccc ~]# head -1 /etc/passwd | tr "bin" "BIN"
      root:x:0:0:root:/root:/BIN/Bash
      [root@ccc ~]# head -1 /etc/passwd | tr -d "root"
      :x:0:0::/:/bin/bash
      

    9.9.5 wc统计

    • 统计,计算数字

      -c # 统计文件的bytes数

      -l # 统计文件的行数

      -w # 统计文件中单词的个数,默认以空白字符作为分隔符

      [root@ccc test]# ll a.py 
      -rw-r--r-- 1 root root 4 10月 27 17:14 a.py
      [root@ccc test]# cat a.py 
      111
      [root@ccc test]# wc -c a.py 
      4 a.py
      [root@ccc test]# wc -l a.py 
      1 a.py
      [root@ccc test]# wc -w a.py 
      1 a.py
      [root@ccc test]# grep "hello" a.py | wc -l
      0
      

    9.10 打包压缩

    9.10.1 基本概念

    • 打包:将多个文件和目录合并为一个特殊文件

    • 压缩:将该特殊文件进行压缩得到一个压缩包

    • 使用压缩包是为了减少占用的体积和加快网络的传输

    • Windows支持:zip、rar

      Linux支持:zip、tar、gz tar、bz2、gz(后缀不重要但一定要带)

    9.10.2 tar.gz与tar.biz2

    • 打包

      [root@ccc test]# tar cvf bak.tar /etc/passwd  # c:创建,v:详细过程,f:打包后文件路径
      tar: 从成员名中删除开头的“/”
      /etc/passwd
      [root@ccc test]# ll
      总用量 16
      -rw-r--r-- 1 root root 10240 10月 27 21:36 bak.tar
      
    • 压缩

      # gzip -> gunzip
      [root@ccc test]# gzip bak.tar 
      [root@ccc test]# ll
      总用量 8
      -rw-r--r-- 1 root root 520 10月 27 21:36 bak.tar.gz
      
      # bzip2 -> bunzip
      [root@ccc test]# bzip2 bak.tar
      [root@ccc test]# ll
      总用量 12
      -rw-r--r-- 1 root root 530 10月 27 21:43 bak.tar.bz2
      
    • 合二为一

      # gzip压缩算法(.gz结尾)
      [root@ccc test]# tar cvzf bak.tar.gz /etc/passwd
      tar: 从成员名中删除开头的“/”
      /etc/passwd
      [root@ccc test]# ll
      总用量 16
      -rw-r--r-- 1 root root   512 10月 27 21:47 bak.tar.gz
      
      # bzip2压缩算法(.bz2结尾)
      [root@ccc test]# tar cvjf bak.tar.bz2 /etc/passwd
      tar: 从成员名中删除开头的“/”
      /etc/passwd
      [root@ccc test]# ll
      总用量 4
      -rw-r--r-- 1 root root   530 10月 27 21:48 bak.tar.bz2
      

    9.10.3 解包

    • tar xvf 压缩包 -C 解压到的目录

      # 针对xxx.tar.gz或者xxx.tar.bz2统一使用
      [root@ccc test]# tar xvf bak.tar.gz -C ~/test
      etc/passwd
      [root@ccc test]# ll
      总用量 12
      -rw-r--r-- 1 root root 512 10月 27 21:54 bak.tar.gz
      drwxr-xr-x 2 root root  20 10月 27 21:55 etc
      
      [root@ccc test]# tar xvf bak.tar.bz2 -C ~/test/
      etc/passwd
      [root@ccc test]# ll
      总用量 12
      -rw-r--r-- 1 root root 530 10月 27 21:54 bak.tar.bz2
      drwxr-xr-x 2 root root  20 10月 27 21:56 etc
      
      # 针对xxx.zip
      [root@ccc test]# unzip bak.zip 
        inflating: etc/passwd              
         creating: etc/yum/
      [root@ccc test]# ll
      总用量 12
      drwxr-xr-x 3 root root  31 10月 27 21:58 etc
      

    9.10.4 zip

    • zip后的第一个参数是压缩包路径,其余为被压缩的文件

      [root@ccc test]# zip bak.zip /etc/passwd /etc/yum
        adding: etc/passwd (deflated 58%)
        adding: etc/yum/ (stored 0%)
      [root@ccc test]# ll
      总用量 4
      -rw-r--r-- 1 root root 704 10月 27 21:52 bak.zip
      

    9.10.5备份

    • 打包压缩常用于备份文件,文件名必须见名知意且带上时间、主机名之类

      # 时间命令date
      [root@ccc test]# date
      2020年 10月 27日 星期二 22:02:15 CST
      [root@ccc test]# date +%F
      2020-10-27
      [root@ccc test]# date +%Y_%m_%d
      2020_10_27
      [root@ccc test]# date +%T
      22:03:10
      [root@ccc test]# date +%H_%M_%S
      22_03_38
      [root@ccc test]# date +%Y_%m_%d_%H_%M_%S
      2020_10_27_22_04_14
      [root@ccc test]# date -d "-1 day" +%F
      2020-10-26
      [root@ccc test]# date -d "1 day" +%F
      2020-10-28
      
      # 备份,引用执行结果用反引号``
      [root@ccc test]# tar cvzf `date +%Y_%m_%d_%H_%M_%S`_bak.tar.gz /etc/passwd
      tar: 从成员名中删除开头的“/”
      /etc/passwd
      [root@ccc test]# ll
      总用量 16
      -rw-r--r-- 1 root root 512 10月 27 22:07 2020_10_27_22_07_12_bak.tar.gz
      

    9.11 文件系统

    9.11.1 简介

    • 文件

      操作系统

      文件系统(属于操作系统的一部分)---->提供了文件的概念

      硬盘

      文件是操作系统提供给用户操控硬盘的一种功能

      也就是说操作系统中肯定有一段代码专门用来提供文件的功能

    • 文件系统

      文件系统是操作系统中的负责控制硬盘的一个软件

      Linux常用xfs、ext4和btrfs

      Windows常用FAT32、NTFS

    • 文件系统-->文件

    • 挂载点与分区

      操作系统---------------------------->文件系统 文件系统 文件系统

      硬盘----------------------------------> 分区1 分区2 分区3

      硬盘分区(文件系统)------------------>目录

    9.11.2 文件系统工作原理

    • 两部分组成:

      ①文件的元信息:例如权限(rwx)、拥有者、群组、时间参数等

      ②文件的实际内容

    • 文件系统通常会把这两部分分别存放在不同的区块

      ①文件的元信息放置到inode区块中

      ②文件的实际内容则放置到data block区块中

      ③每个inode与block都有自己的编号

    • 文件的超级区块(superblock)会记录整个档案的整体信息

      包括inode与block的总量、使用量、剩余量等

    • 硬盘的最小存取单位->扇区(Sector)->512字节->0.5kb

      操作系统的最小存取单位->block块->8个扇区->4kb

    • 总结

      # superblock
      记录此filesystem的整体信息,包括inode/block的总量、使用量、剩余量,及问价系统的格式与相关信息等
      
      # inode
      1、记录文件元信息,包括文件对应的一个或多个block块号码
      2、一个文件被分配唯一一个inode
      
      # block
      1、记录文件实际内容
      2、一个文件过大时可能会被分配多个block块,即一个文件可能对应多个block块的号码,这些号码都存放在该文件的inode里
      

    • 举例

      [root@ccc test]# ls -di /
      64 /
      [root@ccc test]# ls -di /etc/
      4194369 /etc/
      [root@ccc test]# ls -i /etc/passwd
      4739260 /etc/passwd
      
    • cat /etc/passwd的整体过程

    • 通常称ext文件系统为索引式文件系统(indexed allocation)

    9.11.3 扩展

    • inode信息

      inode为索引节点,是Unix操作系统的一种数据结构,本质是结构体

      inode负责存文件的元信息,如文件的创建者、创建日期、大小、inode等

      根本上inode存放除了文件的名字及真实内容外所有有关文件的信息/元数据(metadata)

      ​ 1、inode编号

      ​ 2、用来识别文件类型及用于stat C函数的模型信息

      ​ 3、链接数,即有多少文件名指向这个inode

      ​ 4、属主的ID(UID)

      ​ 5、属主的组ID(GID)

      ​ 6、文件的字节数

      ​ 7、文件所使用的磁盘块的实际数目

      ​ 8、文件的时间戳(ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上依次打开的时间

      ​ 9、指向数据块的指针

      可以用stat命令查看某个文件的inode信息

      [root@ccc test]# touch cjx.py
      [root@ccc test]# stat cjx.py 
        文件:"cjx.py"
        大小:0         	块:0          IO 块:4096   普通空文件
      设备:803h/2051d	Inode:584529      硬链接:1
      权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 22:55:07.390351576 +0800
      最近更改:2020-10-27 22:55:07.390351576 +0800
      最近改动:2020-10-27 22:55:07.390351576 +0800
      创建时间:-
      
      atime  # access time访问文件内容的时间。对文件内容进行一次读操作,访问时间就会变。
      	   # cat、more等操作都会,但stat、ls不会对atime产生影响
      mtime  # modify time修改文件内容的时间。文件内容最后一次修改的时间
      	   # ll命令显示的就是mtime
             # vim编辑保存后,mtime就会改变。
             # 如echo aa >> a.sh 或vim a.txt修改内容
      ctime  # change time指inode上一次文件属性变动时间。
      	   # 文件状态改变,ctime就会改变,例如chmod、chown等
      
      # 使用cat命令查看文件后,文件atime变更
      [root@ccc test]# touch cjx.py
      [root@ccc test]# stat cjx.py 
        文件:"cjx.py"
        大小:0         	块:0          IO 块:4096   普通空文件
      设备:803h/2051d	Inode:584529      硬链接:1
      权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 22:55:07.390351576 +0800
      最近更改:2020-10-27 22:55:07.390351576 +0800
      最近改动:2020-10-27 22:55:07.390351576 +0800
      创建时间:-
      [root@ccc test]# cat cjx.py 
      [root@ccc test]# stat cjx.py 
        文件:"cjx.py"
        大小:0         	块:0          IO 块:4096   普通空文件
      设备:803h/2051d	Inode:584529      硬链接:1
      权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 23:04:49.565459717 +0800
      最近更改:2020-10-27 22:55:07.390351576 +0800
      最近改动:2020-10-27 22:55:07.390351576 +0800
      创建时间:-
      
      # atime不变mtime及ctime改变
      [root@ccc test]# touch zzz.py
      [root@ccc test]# stat zzz.py 
        文件:"zzz.py"
        大小:0         	块:0          IO 块:4096   普通空文件
      设备:803h/2051d	Inode:584530      硬链接:1
      权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 23:07:46.877188087 +0800
      最近更改:2020-10-27 23:07:46.877188087 +0800
      最近改动:2020-10-27 23:07:46.877188087 +0800
      创建时间:-
      [root@ccc test]# cat >> zzz.py << EOF
      111
      EOF
      [root@ccc test]# stat zzz.py 
        文件:"zzz.py"
        大小:4         	块:8          IO 块:4096   普通文件
      设备:803h/2051d	Inode:584530      硬链接:1
      权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 23:07:46.877188087 +0800
      最近更改:2020-10-27 23:08:00.638167014 +0800
      最近改动:2020-10-27 23:08:00.638167014 +0800
      创建时间:-
      
      # atime、mtime不变,ctime改变
      [root@ccc test]# touch mmm.py
      [root@ccc test]# stat mmm.py 
        文件:"mmm.py"
        大小:0         	块:0          IO 块:4096   普通空文件
      设备:803h/2051d	Inode:584531      硬链接:1
      权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 23:09:11.228058875 +0800
      最近更改:2020-10-27 23:09:11.228058875 +0800
      最近改动:2020-10-27 23:09:11.228058875 +0800
      创建时间:-
      [root@ccc test]# ll mmm.py 
      -rw-r--r-- 1 root root 0 10月 27 23:09 mmm.py
      [root@ccc test]# chmod 000 mmm.py 
      [root@ccc test]# stat mmm.py 
        文件:"mmm.py"
        大小:0         	块:0          IO 块:4096   普通空文件
      设备:803h/2051d	Inode:584531      硬链接:1
      权限:(0000/----------)  Uid:(    0/    root)   Gid:(    0/    root)
      最近访问:2020-10-27 23:09:11.228058875 +0800
      最近更改:2020-10-27 23:09:11.228058875 +0800
      最近改动:2020-10-27 23:10:03.715978463 +0800
      创建时间:-
      [root@ccc test]# ll mmm.py 
      ---------- 1 root root 0 10月 27 23:09 mmm.py
      
    • inode大小(df -i)

      inode会消耗硬盘空间,因此硬盘格式化时操作系统会将硬盘分为两个区域

      ​ ①inode区(inode table):存放inode所包含的信息

      ​ ②block数据区:存放文件数据

      查看硬盘分区的inode总数和已使用量用df -i命令

      每个文件必须要有一个inode,因此inode用光但硬盘未存满时也无法在硬盘上创建新文件

      # 查看xfs文件系统每个inode节点大小(centos7)
      xfs_info /dev/sda3
      
      # 查看ext文件系统每个inode节点大小(centos6)
      sudo dumpe2fs -h /dev/hda | grep "Inode size"
      
    • inode号码

      每个inode都有一个号码,操作系统用inode号码来识别不同的文件

      Linux系统不使用文件名,而使用inode号码来识别文件

      ​ ①系统找到这个文件名是对应的inode号码

      ​ ②通过inode号码获取inode信息

      ​ ③根据inode信息找到文件数据所在的block,读出数据

      使用ls -i命令可以看到文件名对应的inode号码

      [root@ccc test]# ls -i cjx.py 
      584529 cjx.py
      
    • 目录项

      Linux系统中目录(directory)也是一种文件。打开目录实际上就是打开目录文件

      目录结构:一系列目录项(dirent)的列表。

      目录项两个组成部分:所包含文件的文件名,给文件名对应的inode号码

      ls命令:列出目录文件中的所有文件名

      [root@ccc test]# ls
      cjx.py  mmm.py  zzz.py
      

      ls -i命令:列出整个目录文件,即文件名和inode号码

      要查看文件的详细信息就要根据inode号码访问inode节点,读取信息

      [root@ccc test]# ls -i
      584529 cjx.py  584531 mmm.py  584530 zzz.py
      
    • FAT文件系统

      U盘采用的档案系统一般为FAT格式。

      FAT格式的档案系统没有inode,每个block号码都记录在前一个block当中。

      档案系统无法一次知道四个block号码,只能将前block读出后才会知道下一个block在哪里,归于分散时,磁盘要多转好几圈才能完整读取档案的内容。

      碎片整理:原因是档案写入的block过于离散,读取性能会变差,此时通过碎片整理将同一个档案归属的blocks汇整在一起,读取会比较容易。

    • inode特殊作用

      ①文件名包含特殊字符无法正常删除时,直接删除inode节点可以删除文件

      ②移动文件或重命名文件,只改变文件名,不影响inode号码

      ③打开一个文件后,系统就以inode号码来识别这个文件,不考虑文件名

      ​ 通常来说,系统无法从inode号码来得知文件名

      [root@ccc test]# ls -i
      584529 cjx.py  584531 mmm.py  584530 zzz.py
      [root@ccc test]# ls -i cjx.py 
      584529 cjx.py
      [root@ccc test]# vim cjx.py 
      [root@ccc test]# ls -i cjx.py 
      584533 cjx.py
      [root@ccc test]# mv cjx.py CJX.py
      [root@ccc test]# ls -i CJX.py 
      584533 CJX.py
      

      Q:每次修改完服务器配置文件后,为什么需要重新加载配置文件?

      A:因为每次修改完inode都会变,系统还是读取原来的inode号的配置文件,每次修改完服务器的配置文件都要重启服务,重新读一下配置文件。

    9.11.4 软链接、硬链接

    • 硬链接(Hard Link) ---->通过"ln 源文件 目标文件" 设置硬链接

      ①对硬链接文件内容进行修改,会影响到所有文件名

      ②硬链接文件与源文件具有相同inode的不同文件名。一个文件只能有一个inode号,但多个文件的inode号可以相同

      ③删除硬链接或源文件之一,不影响另一个文件名的访问,除非都删掉

      ​ 硬链接允许一个文件拥有多个有效路径,用户可以建立硬链接连接到重要文件以防误删

      ④创建目录自动生成的两个目录项"."和".."

      ​ "."的inode号码是当前目录的inode号码,等同于当前目录的硬链接

      ​ ".."的inode号码是当前目录父目录的inode号码,等同于父目录的硬链接

      ​ 任何一个目录的硬链接总数=2+他的子目录总数(含隐藏目录)

      ⑤删除所有的硬链接,数据会在被磁盘检查或新数据写入时删除回收

      ⑥通过rm -rf删除硬链接

      ⑦目录不可创建硬链接,且硬链接无法跨区

    • 软链接(符号链接Symbolic Link) ---->通过"ln -s 源文件 目标文件" 创建软链接

      ①对软链接的源文件或目标文件内容进行修改,会影响到所有文件名

      ②软链接文件与源文件具有不同的inode号

      ③删除软链接文件的源文件,软链接文件将无法使用

      ④软链接作用:软件升级、企业代码发布、不方便目录移动

      ⑤删除源文件后,软链接文件无效,也应一起删除以便回收

      ⑥通过rm -rf删除软链接

      ⑦可以对目录创建软链接,且软链接可以跨分区

    • 示例

      ==============================硬链接===================================
      [root@ccc ~]# touch aaa.py
      [root@ccc ~]# ln aaa.py bbb.py
      [root@ccc ~]# ls -i aaa.py 
      8493577 aaa.py
      [root@ccc ~]# ls -i bbb.py 
      8493577 bbb.py
      [root@ccc ~]# ll aaa.py 
      -rw-r--r-- 2 root root 0 10月 28 22:52 aaa.py
      [root@ccc ~]# ll bbb.py 
      -rw-r--r-- 2 root root 0 10月 28 22:52 bbb.py
      [root@ccc ~]# 
      ==============================软链接===================================
      [root@ccc test]# touch 1.py
      [root@ccc test]# ln -s 1.py 2.py
      [root@ccc test]# ls -i 1.py 
      584530 1.py
      [root@ccc test]# ls -i 2.py 
      584531 2.py
      [root@ccc test]# ll 1.py   # 硬链接数为1
      -rw-r--r-- 1 root root 0 10月 28 22:57 1.py
      [root@ccc test]# ll 2.py   # 硬链接数为1
      lrwxrwxrwx 1 root root 4 10月 28 22:57 2.py -> 1.py
      [root@ccc test]# rm -rf 1.py 
      [root@ccc test]# ll 2.py   # 删掉1.py,2.py不可用
      lrwxrwxrwx 1 root root 4 10月 28 22:57 2.py -> 1.py
      
      [root@ccc test]# mkdir ./dir1
      [root@ccc test]# ln ./dir1 ./dir2
      ln: "./dir1": 不允许将硬链接指向目录
      [root@ccc test]# ln -s ./dir1 ./dir2
      [root@ccc test]# ll
      总用量 0
      drwxr-xr-x 2 root root 6 10月 28 23:00 dir1
      lrwxrwxrwx 1 root root 6 10月 28 23:01 dir2 -> ./dir1
      

    9.11.5 实战应用

    • 磁盘有空间但创建不了文件

      df -h查看磁盘使用情况(此时磁盘空间足够)

      df -i查看磁盘的索引节点(inode)(此时IUsed=100%)

      原因:数量众多的小字节缓存文件占用大量的inode,但占用的block不多

      解决方案:

      ①删除目录中部分文件,释放分区一部分inode

      ②备份好文件,然后删除这些文件来释放inode,然后创建一个新文件夹。

      ​ 在cache2下挂在一个新分区sda4,下次写数据写到新分区cache2目录下

      tips:inode分区完后不增加inode数量,改变inode大小

    • 其他场景

      大量小文件问题:

      可能会使inode耗尽,使得文件无法创建(磁盘利用率低)

      方案:将block划分小一点

      大文件问题:

      一个文件占用多个block,是的文件读写速率慢

      方案:将block划分大一点

      ext文件系统---->xfs文件系统

    • 解决硬盘不够用的方案

      1、加一块硬盘

      2、分区(不分区整体相当于一个分区)

      3、制作文件系统:mkfs.xfs /dev/sdb

      4、挂载:mount /dev/sdb /boot/data

      ​ touch /boot/data/aaa.txt

    • 面试题:Linux中软链接与硬链接区别

      1、从定义: linux系统中,链接有两种,一种被称为软链接,类似于快捷方式,存放指向原文件inode的信息,与原文件inode不同。 一种是硬链接,与原文件有相同的inode,可以指向数据block。
      2、从创建方式:硬链接命令In 原文件 目标文件,软链接命令ln -s 原文件目 标文件
      3、从创建对象: In命令不能对目录创建硬链接,但是可以对目录创建软链接。因为软链接可以跨越文件系统,硬链接则不能。对目录和为客户创建的文件软链接经常用到。
      4、删除软链接文件,对硬链接和原文件无影响。
      5、删除文件硬链接,对原文件及软链接文件无影响
      6、删除原文件,对硬链接读取数据无影响,软链接则失效。会出现红底白字状。
      7、同时删除原文件和硬链接,原文件才会被真正删除
      8、很多硬件设备中的快照原理,类似于硬链接原理

  • 相关阅读:
    前人风采
    【C++ Primer 第16章】1. 定义模板 (一)
    CCF CSP认证考试试题
    【C++ Primer 第11章】4. 无序容器
    【C++ Primer 第11章 练习答案】2. 关联容器操作
    【C++ Primer 第11章】2. 关联容器操作
    dxRatingControl使用
    dxRangeTrackBar使用教程
    UniConnectDialog使用
    Delphi窗体置顶及失去焦点后取得焦点
  • 原文地址:https://www.cnblogs.com/caojiaxin/p/14004691.html
Copyright © 2020-2023  润新知