零基础领跑教科书式博文:DAY2---Linux文件管理

Posted 给小李三分薄面

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了零基础领跑教科书式博文:DAY2---Linux文件管理相关的知识,希望对你有一定的参考价值。

文件管理

文件系统结构

  • 文件和目录被组织成一个单根倒置树结构
  • 文件系统从根目录下开始,用“/”表示
  • 根文件系统(rootfs):root filesystem
  • 文件名称区分大小写
  • 以.开头的文件为隐藏文件
  • 路径分隔的 /
  • 文件有两类数据:
    元数据:metadata
    数据:data
  • 文件系统分层结构:LSB Linux Standard Base
  • FHS: (Filesystem Hierarchy Standard)
    http://www.pathname.com/fhs/
  • 文件名最长255个字节
  • 包括路径在内文件名称最长4095个字节
  • 蓝色-->目录 绿色-->可执行文件 红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
    cat /etc/DIR_COLORS
  • 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们。
  • 标准Linux文件系统(如ext4),文件名称大小写敏感。例如:MAIL, Mail, mail, mAiL

各目录介绍

  • /boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
  • /bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
  • /sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
  • /lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
  • /lib64:专用于x86_64系统上的辅助共享库文件存放位置
  • /etc:配置文件目录
  • /home/USERNAME:普通用户家目录
  • /root:管理员的家目录
  • /media:便携式移动设备挂载点
  • /mnt:临时文件系统挂载点
  • /dev:设备文件及特殊文件存储位置
    b: block device,随机访问
    ♦ /dev/sda
    c: character device,线性访问
    ♦ /dev/zero
  • /opt:第三方应用程序的安装位置
  • /srv:系统上运行的服务用到的数据
  • /tmp:临时文件存储位置
  • /usr: universal shared, read-only data
    ♦ bin: 保证系统拥有完整功能而提供的应用程序
    ♦ sbin:
    ♦ lib:32位使用
    ♦ lib64:只存在64位系统
    ♦ include: C程序的头文件(header files)
    ♦ share:结构化独立的数据,例如doc, man等
    ♦ local:第三方应用程序的安装位置
     ➢ bin, sbin, lib, lib64, etc, share
  • /var: variable data files
    ♦ cache: 应用程序缓存数据目录
    ♦ lib: 应用程序状态信息数据
    ♦ local:专用于为/usr/local下的应用程序存储可变数据;
    ♦ lock: 锁文件
    ♦ log: 日志目录及文件
    ♦ opt: 专用于为/opt下的应用程序存储可变数据;
    ♦ run: 运行中的进程相关数据,通常用于存储进程pid文件
    ♦ spool: 应用程序数据池
    ♦ tmp: 保存系统两次重启之间产生的临时数据
  • /proc: 用于输出内核与进程信息相关的虚拟文件系统
  • /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统
    echo "- - -" > /sys/class/scsi_host/host0/scan
  • /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置

♥ CentOS 7目录变化

  • /bin 和 /usr/bin
  • /sbin 和 /usr/sbin
  • /lib 和/usr/lib
  • /lib64 和 /usr/lib64

♥ 应用程序组成部分

  • 二进制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
  • 库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
  • 配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
  • 帮助文档
    ♦ /usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

Linux下的文件类型及目录

文件类型

  • -:普通文件
  • d: 目录文件
  • b: 块设备
  • c: 字符设备
  • l: 符号链接文件
  • p: 管道文件pipe
  • s: 套接字文件socket

相关概念

  • 显示当前工作目录
    ♦ 每个shell和系统进程都有一个当前的工作目录
    ♦ CWD:current work directory
    ♦ 显示当前shell CWD的绝对路径
  • 绝对路径
    ♦ 以正斜杠开始
    ♦ 完整的文件的位置路径
    ♦ 可用于任何想指定一个文件名的时候
  • 相对路径名
    ♦ 不以斜线开始
    ♦ 指定相对于当前工作目录或某目录的位置
    ♦ 可以作为一个简短的形式指定一个文件名
  • 基名:basename
  • 目录名:dirname
  • 小技巧,创建删除特殊的文件
    touch ./-host
    rm -rf ./-host

相关命令

cd

  • 改变目录
  • 使用绝对或相对路径:
    ♦ cd /home/fang
    ♦ cd home/fang
  • 切换至父目录: cd ..
  • 切换至当前用户主目录: cd
  • 切换至以前的工作目录: cd -
  • 选项:-P
  • 相关的环境变量:
    ♦ PWD:当前目录路径
    ♦ OLDPWD:上一次目录路径

pwd

  • printing working directory
    ♦ -P 显示真实物理路径 软链接的时候有用到
    ♦ -L 显示链接路径(默认)

ls

  • 列出当前目录的内容或指定目录

  • 用法:ls [options] [files_or_dirs]

  • 示例
    ♦ ls -a 包含隐藏文件
     ➢ ls -d /etc/.*
     ➢ ls -d /etc/.[^.]* 目录下所有隐藏文件
     ➢ ls -I "[^.]*" -a
     ➢ l.

    ♦ ls -l 显示额外的信息
    ♦ ls -R 目录递归通过
     ➢ ls -lR /etc/ | grep "^-" | wc -l 统计目录所有的文件

    ♦ ls -ld 目录和符号链接信息
     ➢ ls -ld /etc 查看目录信息

    ♦ ls -1 文件分行显示
    ls –S 按从大到小排序
     ➢ ls -Sr 按从小到大排序

    ls –t 按mtime排序
    ♦ ls –u 配合-t选项,显示并按atime从新到旧排序
    ♦ ls –U 按目录存放顺序显示
    ♦ ls –X 按文件后缀排序

stat

  • 文件:metadata, data

  • 三个时间戳
    ♦ access time:访问时间,atime,读取文件内容
     ➢ ls -l 1.file --time=atime

    ♦ modify time: 修改时间, mtime,改变文件内容(数据)
     ➢ ls -l 默认看到的时间

    ♦ change time: 改变时间, ctime,元数据发生改变

touch

  • touch [OPTION]… FILE…
    ♦ -a 仅改变 atime和ctime
    ♦ -m 仅改变 mtime和ctime
    ♦ -t [[CC]YY]MMDDhhmm[.ss]
    ♦ -c 如果文件不存在,则不予创建

cp

  • cp [OPTION]… [-T] SOURCE DEST
  • cp [OPTION]… SOURCE… DIRECTORY
  • cp [OPTION]… -t DIRECTORY SOURCE…
  • cp常用选项
    ♦ -i:覆盖前提示 –n:不覆盖,注意两者顺序
    ♦ -r, -R: 递归复制目录及内部的所有内容
    -a: 归档,相当于-dR --preserv=all (保留属性常用)
    ♦ -d:--no-dereference --preserv=links 不复制原文件,只复制链接名
    ♦ --preserv[=ATTR_LIST]
     ➢ mode: 权限
     ➢ ownership: 属主属组
     ➢ timestamp:
     ➢ links
     ➢ xattr
     ➢ context
     ➢ all
    ♦ -p: 等同--preserv=mode,ownership,timestamp
    ♦ -v: --verbose
    ♦ -f: --force
    -u:--update 只复制源比目标更新文件或目标不存在的文件
    ♦ --backup=numbered 目标存在,覆盖前先备份加数字后缀
  • cp SRC DEST SRC是文件:
    ♦ 如果目标不存在:新建DEST,并将SRC中内容填充至DEST中
    ♦ 如果目标存在:
     ➢ 如果DEST是文件:将SRC中的内容覆盖至DEST中
     ➢ 如果DEST是目录:在DEST下新建与原文件同名的文件,并将SRC中内容填充至新文件中
  • cp SRC DEST SRC是目录:
    ♦ 此时使用选项:-r
    ♦ 如果DEST不存在:则创建指定目录,复制SRC目录中所有文件至DEST中;
    ♦ 如果DEST存在:
     ➢ 如果DEST是文件:报错
     ➢ 如果DEST是目录:在DEST下新建与原目录同名的目录,并将SRC中内容复制至新目录中
    ♦ 示图

mv

  • mv [OPTION]… [-T] SOURCE DEST
  • mv [OPTION]… SOURCE… DIRECTORY
  • mv [OPTION]… -t DIRECTORY SOURCE…
  • 常用选项
    ♦ -i: 交互式
    ♦ -f: 强制
  • mv f1 /dir2/f2 底层实现原理
    ♦ 同一分区:Inode节点编号跟数据存放位置不变,原文件与新文件为同一个文件
    ♦ 不同分区:Inode节点编号跟数据存放位置发生变化,原文件与新文件为不同文件
  • ln -s /root/f1 /root/2/f2 底层实现原理
    ♦ 在/root/2/目录下创建新文件f2、Inode节点编号发生变化
    ♦ f2为f1的软链接,访问f2 Inode指针指向f1的数据存放位置

rename

  • 批量修改文件

    ♦ 示例

    touch f{1..100}.txt
    rename "txt" "txt.bak" *.txt
    rename \'.bak\' \'\' *.bak

rm

  • rm [OPTION]… FILE…
  • 常用选项:
    ♦ -i 交互式
    ♦ -f 强制删除
    ♦ -r 递归
    ♦ rm -rf 慎用
    alias rm=mv -t /trash
  • 删除大文件方法、立即释放空间
    ♦ > bigfile
    ♦ rm -f bigfile
  • shred 反复覆盖
    ♦ shred -zvu -n5 f2
    ♦ u 是否删除文件

tree

  • -d: 只显示目录
  • -L level:指定显示的层级数目
    tree -d -L 1 /etc
  • -P pattern: 只显示由指定pattern匹配到的路径

mkdir

  • -p: 存在于不报错,且可自动创建所需的各目录
  • -v: 显示详细信息
  • -m MODE: 创建目录时直接指定权限

rmdir

  • -p: 递归删除父空目录
  • -v: 显示详细信息

file

  • 文件可以包含多种类型的数据
  • 检查文件的类型,然后确定适当的打开命令或应用程序使用
  • file [options] …
  • 常用选项:
    ♦ -b 列出文件辨识结果时,不显示文件名称
    ♦ -f filelist 列出文件filelist中文件名的文件类型
    ♦ -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
    ♦ -L 查看对应软链接对应文件的文件类型
    ♦ --help 显示命令在线帮助
    hexdump -C -n 100 f1 查看文件2进制前100个字节

文件通配符

  • * 匹配零个或多个字符

  • ? 匹配任何单个字符

  • ~ 当前用户家目录

  • ~ fang 用户fang家目录

  • ~ + 当前工作目录

  • ~ - 前一个工作目录

  • [0-9] 匹配数字范围

  • [a-z]:字母
    ♦ 示例

    ll [a-c].file
    
    -rw-r--r--. 1 root root 0 Nov  5 06:49 a.file
    -rw-r--r--. 1 root root 0 Nov  5 06:49 A.file
    -rw-r--r--. 1 root root 0 Nov  5 06:49 b.file
    -rw-r--r--. 1 root root 0 Nov  5 06:49 B.file
    -rw-r--r--. 1 root root 0 Nov  5 06:49 c.file
  • [A-Z]:字母

  • [fang] 匹配列表中的任何的一个字符

  • [^fang] 匹配列表中的所有字符以外的字符

♥ 预定义的字符类

  • [:digit:]:任意数字,相当于0-9

  • [:lower:]:任意小写字母

  • [:alnum:]:任意数字或字母

  • [:blank:]:水平空白字符

  • [:space:]:水平或垂直空白字符

  • [:punct:]:标点符号

  • [:print:]:可打印字符

  • [:cntrl:]:控制(非打印)字符

  • [:graph:]:图形字符

  • [:xdigit:]:十六进制字符

索引节点

inode

  • df -i 查看分区的节点使用率
    echo {1..600000}.file | xargs touch测试
    Inode节点使用率100%,会导致磁盘有剩余空间、但文件无法写入
  • inode(index node)表中包含文件系统所有文件列表
  • 一个节点 (索引节点)是在一个表项,包含有关文件的信息( 元数据 ),包括:
    ♦ 文件类型,权限,UID,GID
    ♦ 链接数(指向这个文件名路径名称个数)
    ♦ 该文件的大小和不同的时间戳
    ♦ 指向磁盘上文件的数据块指针
    ♦ 有关文件的其他数据
  • inode表结构
    ♦ 示图

  • 目录与inode关系
    ♦ 文件引用的是 inode号
    ♦ 人是通过文件名来引用一个文件
    ♦ 一个目录是目录下的文件名和文件inode号之间的映射
    ♦ 示图
  • 节点编号
    ♦ 独立分区的目录挂载点,Inode节点编号一样
    ♦ Centos7 挂截点节点编号64
    ♦ Centos6 挂载点节点编号2
    同一分区内的文件、Inode节点编号相同为同一个文件
  • 指针与数据块的关系
    直接指针的数量为12个
    ♦ 直接指针可表达的48k以内的容量
    ♦ 一个间接指针可表达4M的容量
    ♦ 间接指针指向一个4K的数据块,每个数据块包含1024个小块,每块小块指向4K的数据,所以一个间接指针可表达 1024X4=4M的数据
    ♦ 双重间接指针可表达4G的容量
    ♦ 三级指针可表达4T的容量
  • Inode节点编号与目录的关系
    ♦ 目录的节点编号的指针、所指向的数据块,存放的是它目录下文件的节点编号与文件名称列表

相关命令与inode索引关系

cp和inode

  • 命令: cp
    ♦ 分配一个空闲的inode号,在inode表中生成新条目
    ♦ 在目录中创建一个目录项,将名称与inode编号关联
    ♦ 拷贝数据生成新的文件

rm和inode

  • 命令: rm
    ♦ 链接数递减,从而释放的inode号可以被重用
    ♦ 把数据块放在空闲列表中
    ♦ 删除目录项
    ♦ 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。

mv和inode

  • 如果mv命令的目标和源在相同的文件系统,作为mv 命令
    ♦ 用新的文件名创建对应新的目录项
    ♦ 删除旧目录条目对应的旧的文件名
    ♦ 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
  • 如果目标和源在一个不同的文件系统, mv相当于cp和rm

软、硬链接

硬链接

  • 创建硬链接会增加额外的记录项以引用文件
  • 对应于同一文件系统上一个物理文件
  • 每个目录引用相同的inode号
  • 创建时链接数递增
  • 删除文件时:
    ♦ rm命令递减计数的链接
    ♦ 文件要存在,至少有一个链接数
    ♦ 当链接数为零时,该文件被删除
  • 不能跨越驱动器或分区
  • 语法:
    ♦ ln filename [linkname ]
    ln file1 file2 本质上给file1 起了一个新的名字 同一个文件、不同的名字

软(或符号)链接

  • 一个符号链接指向另一个文件
    软链接本质上不是同一个文件,链接文件依赖原文件

  • ls - l的 显示链接的名称和引用的文件

  • 一个符号链接的内容是它引用文件的名称

  • 可以对目录进行

  • 可以跨分区

  • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减目标文件inode的引用计数;

  • 语法:
    ♦ ln -s filename ​​[linkname] 创建软链接
    ♦ ln -snf newfilename [linkname] 更改软链接
    ♦ 示例

    ls -l /dev/sda
    brw-rw----. 1 root disk 8, 0 Nov  5 15:56 /dev/sda
    #8设备类型
    #0这个类型的第几个设备
  • 软链接文件的大小由指向文件的字节数决定

软、硬链接本质区别

  1. 软链接本质上是一个新的文件、只是一个快捷方式,硬链接本质上是同一个文件,重新命名了一个新名称
  2. 创建软链接不会增加链接数,创建硬链接、会增加文件链接数
  3. 软链接支持跨分区、跨设备、目录,硬链接不支持跨分区、跨设备、目录
  4. 创建软链接节点编号与原始文件节点编号不相同。创建硬链接,节点编号与原始文件节点编号相同
  5. 软链接文件与原始文件有主次之分,软链接文件依赖原始文件。硬链接文件与原始文件关系平等

练习

  1. 显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录

    ls /var/l*[0-9]*[[:lower:]]
  2. 显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录

    ls /etc/[0-9]*[^0-9]
  3. 显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录

    ls -d /etc/[^[:alpha:]][[:alpha:]]*
  4. 显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录

    ls -d  /etc/rc[0-6]*
  5. 显示/etc目录下,所有以.d结尾的文件或目录

    ls -d /etc/*.d
  6. 显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录

    ls -d /etc/[mnrp]*.conf
  7. 只显示/root下的隐藏文件和目录

    ls -d /root/.*
  8. 只显示/etc下的非隐藏目录

    ls -d /etc/*/
  9. 定义别名命令baketc,每天将/etc/目录下所有文件,备份到/app独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见

    alias baketc=\'cp -av /etc/ /app/backup$(date +%F)\'
  10. 创建/app/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限

    mkdir /app ; cp -av /root/ /app/rootdir
  11. 备份/root下所有内容(包括隐藏和非隐藏)到/data目录下

    cp -ar /root/. /data
  12. 如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b

    mkdir -pv /testdir/dir1/{x,y}/{a,b}
  13. 如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b

    mkdir -pv /testdir/dir2/{x/{a,b},y}
  14. 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7

    mkdir -pv /testdir/{dir3,dir4,dir5/{dir6,dir7}}

以上是关于零基础领跑教科书式博文:DAY2---Linux文件管理的主要内容,如果未能解决你的问题,请参考以下文章

jQuery零基础入门——层级选择器

jQuery零基础入门——Selector选择器

thinkphp5.1从零基础 入门到熟练教程,适合小白阅读

thinkphp5.1从零基础 入门到熟练教程,适合小白阅读

零基础带你一步步搭建Nacos高可用集群(史上最详细,赛过教科书!)为此我准备了三台云服务器+云数据库

Win10基础 博文目录