zoukankan      html  css  js  c++  java
  • 3.Linux文件管理

    1.Linux系统目录结构

    1.1目录及功能

    目录规范参考网站:http://www.pathname.com/fhs/

    /bin:用户基本命令

    /sbin:系统管理类命令

    /lib:启动时程序依赖的基本共享库文件以及内核模块文件

    /lib64:专用于x86_64系统上的辅助共享库文件存放位置

    (以上目录在centos8中变为、usr对应目录的软链接)

    /usr: the second major section of the filesystem,shareable, read-only data

    • bin:可执行命令的主目录
    • sbin:系统管理员专用命令
    • lib:32位使用
    • lib64:64位系统专用
    • share:应用程序资源保存位置如帮助文档、字体等
    • local:第三方应用程序安装位置

    /boot:系统引导文件存放目录

    /etc:配置文件目录

    /home:用户家目录

    /root:管理员家目录

    /media:便携式移动设备挂载点

    /mnt:临时文件系统挂载点

    /dev:设备文件及特殊文件存储位置

    /opt:第三方应用程序的安装位置

    /tmp:临时文件存储位置

    /var:可变数据文件目录(日志,管理数据等)

    • cache: 应用程序缓存数据目录
    • lib: 应用程序状态信息数据
    • local:专用于为/usr/local下的应用程序存储可变数据
    • lock: 锁文件
    • log: 日志目录及文件
    • opt: 专用于为/opt下的应用程序存储可变数据
    • run: 运行中的进程相关数据,通常用于存储进程pid文件
    • spool: 应用程序数据池
    • tmp: 保存系统两次重启之间产生的临时数据

    /proc: 用于输出内核与进程信息相关的虚拟文件系统

    /sys:用于输出当前系统上硬件设备相关信息虚拟文件系统

    /selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置

    1.2文件类型及组成

    每个文件都有两类相关数据:元数据:metadata,即属性, 数据:data,即文件内容

    1.2.1 文件组成

    -:表示普通文件

    d:目录文件

    b:块设备文件(以块为单位如磁盘,U盘等设备)

    c:字符设备(以字符为单位,并按一定的顺序进行输入输出,如鼠标键盘等设备)

    l:链接文件(可以简单理解为windows中的软链接)

    p:管道文件(特殊文件类型,主要是为了实现进程间的通信,采用半双工通信)

    s:套接字文件socket:(全双工通信,通常用于基于网络的数据通讯)

    2.文件操作命令

    2.1 pwd

    pwd:查看用户当前所在目录

    • -L 显示链接路径(默认)
    • -P 显示真实物理路径
    [root@centos8 bin]# ll /bin
    lrwxrwxrwx. 1 root root 7 May 11  2019 /bin -> usr/bin
    [root@centos8 bin]# pwd -L
    /bin
    [root@centos8 bin]# pwd -P
    /usr/bin
    

    2.2基名字和目录名

    基名:basename,路径只取文件名

    目录名:dirname,路径只取路径

    [root@centos8 bin]# basename /etc/sysconfig/network
    network
    [root@centos8 bin]# dirname !*
    dirname /etc/sysconfig/network
    /etc/sysconfig
    

    2.3 cd

    cd: cd [-L|[-P [-e]] [-@]] [dir]
    Change the shell working directory.

    快捷用法

    • 切换至父目录 cd ..
    • 切换至当前工作目录 cd .
    • 切换至上一次工作目录 cd -

    注意:这里上一次工作目录是保存在OLDPWD变量当中的,所以只能切换到上一次工作目录,而无法返回再往前的目录

    [root@centos8 bin]# cd /
    [root@centos8 /]# echo $OLDPWD
    /bin
    [root@centos8 /]# cd -
    /bin
    

    2.4 ls

    ls :列出当前目录内容或指定目录内容

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

    常用选项

    • -a 列出所有文件,包括隐藏文件
    • -l 显示更为详细的信息
    • -R 递归展示目录
    • -d 展示目录而不显示目录的内容
    • -s 按照大小排序
    • -t 按照mtime排序

    说明:

    ls 查看不同后缀文件时的颜色由 /etc/DIR_COLORS 和@LS_COLORS变量定义

    ls是'ls --color=auto'别名

    [root@centos8 etc]# ls -ld /etc/
    drwxr-xr-x. 78 root root 8192 Dec  6 06:19 /etc/
    

    2.5 stat

    stat:显示文件或文件系统的状态

    文件三个时间戳及其含义:

    • atime 访问时间,如执行读取文件操作可以改变访问时间
    • mtime 修改时间 ,如利用vim修改文件时时间会发生改变
    • ctime 改变时间,元数据(文件属性)发生改变时
    [root@centos8 ~]# stat ls
      File: ls
      Size: 116       	Blocks: 8          IO Block: 4096   regular file
    Device: 802h/2050d	Inode: 201327540   Links: 1
    Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
    Context: unconfined_u:object_r:admin_home_t:s0
    Access: 2020-11-29 22:04:36.787356892 +0800
    Modify: 2020-11-29 22:04:36.787356892 +0800
    Change: 2020-11-29 22:04:36.787356892 +0800
     Birth: -
     
     #使用ll就能查看到文件的元数据
     [root@centos8 ~]# ll
    -rw-------. 1 		root root 		1548 Nov 21 03:24 anaconda-ks.cfg	
    -rw-r--r--. 1 		root root    		0 Dec  7 05:01 lx.txt
    #权限	引用计数	所有者和所属组		大小	 修改时间	文件名
    

    2.6 file

    file:判断文件类型

    file [options] <filename>...
    

    常用选项:

    • -b 只显示判断的文件类型,不显示文件名
    • -f 判断文件File中文件名的类型
    • -F 使用指定分隔符号替换输出文件名后默认的”:”分隔符
    • -L 查看对应软链接对应文件的文件类型
    [root@centos8 ~]# cat lx.txt 
    /root/lx.txt
    /root/ls
    /etc/sysconfig
    [root@centos8 ~]# file -f lx.txt 
    /root/lx.txt:   ASCII text
    /root/ls:       ASCII text
    /etc/sysconfig: directory
    [root@centos8 ~]# file -L /bin/
    /bin/: directory
    [root@centos8 ~]# file /bin
    /bin: symbolic link to usr/bin
    

    注意:windows文件系统和linux是不同的,即使windows文本格式文件在linux系统中以16进制查看所显示内容也是有区别的,所以尽量不要在Linux系统中使用windows的文件,如要使用也最好进行文件转换

    [root@centos8 data]#cat linux.txt
    a
    b
    c
    [root@centos8 data]#cat win.txt
    a
    b
    c[root@centos8 data]#file win.txt linux.txt
    win.txt:   ASCII text, with CRLF line terminators
    linux.txt: ASCII text
    [root@centos8 data]#hexdump -C linux.txt
    00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
    00000006
    [root@centos8 data]#hexdump -C win.txt
    00000000  61 0d 0a 62 0d 0a 63                             |a..b..c|
    00000007
    #安装转换工具
    [root@centos8 data]#dnf -y install dos2unix
    #将Windows的文本格式转换成的Linux文本格式
    [root@centos8 data]#dos2unix win.txt
    dos2unix: converting file win.txt to Unix format...
    [root@centos8 data]#file win.txt
    win.txt: ASCII text
    #将Linux的文本格式转换成Windows的文本格式
    [root@centos8 data]#unix2dos win.txt
    unix2dos: converting file win.txt to DOS format...
    [root@centos8 data]#file win.txt
    win.txt: ASCII text, with CRLF line terminators
    

    转换文件字符集编码

    #显示支持字符集编码列表
    [root@centos8 ~]#iconv -l
    #windows10上文本默认的编码ANSI(GB2312)
    [root@centos8 data]#file windows.txt
    windows.txt: ISO-8859 text, with no line terminators
    [root@centos8 data]#echo $LANG
    en_US.UTF-8
    #默认在linux无法正常显示文本内容
    [root@centos8 data]#cat windows11.txt
    ▒▒▒▒▒▒[root@centos8 data]#
    #将windows10上文本默认的编码ANSI(GB2312)转换成UTF-8
    [root@centos8 data]#iconv -f gb2312 windows.txt -o windows1.txt
    [root@centos8 data]#cat windows1.txt
    123[root@centos8 data]#ll windows1.txt
    -rw-r--r-- 1 root root 12 Mar 23 10:13 windows1.txt
    [root@centos8 data]#file windows1.txt
    windows1.txt: UTF-8 Unicode text, with no line terminators
    #将UTF-8转换成windows10上文本默认的编码ANSI(GB2312)
    [root@centos8 data]#iconv -f utf8 -t gb2312 windows1.txt -o windows11.txt
    [root@centos8 data]#file windows11.txt
    windows11.txt: ISO-8859 text, with no line terminators
    

    示例

    #将windows10上文本默认的编码ANSI(GB2312)转换成UTF-8
    [15:34:50 root@centos8 ~]#iconv -f gb2312 win.txt -o win2.txt  
    [15:34:50 root@centos8 ~]#file linux.txt
    linux.txt: ASCII text
    [15:34:31 root@centos8 ~]#file windows.txt
    windows.txt: ASCII text, with CRLF line terminators
    #将windows的文本格式转换成Linux的文本格式
    [15:35:26 root@centos8 ~]#dos2unix windows.txt
    dos2unix: converting file windows.txt to Unix format...
    [15:36:00 root@centos8 ~]#file windows.txt
    windows.txt: ASCII text
    

    示例

    [root@centos8 ~]#cat list.txt
    /etc/
    /bin
    /etc/issue
    [root@centos8 ~]#file -f list.txt
    /etc/:     directory
    /bin:       symbolic link to usr/bin
    /etc/issue: ASCII text
    

    2.7通配符

    用来匹配符合条件的文件

    常见的通配符

    * 匹配零个或多个字符,但不匹配 "." 开头的文件,即隐藏文件
    ? 匹配任何单个字符
    ~ 当前用户家目录
    ~user 用户user家目录
    ~+和.   当前工作目录
    ~-   前一个工作目录
    [0-9] 匹配数字范围
    [a-z] 匹配小写字母范围
    [A-Z] 匹配大写字母范围
    [number] 匹配列表中的任何的一个字符
    [^number] 匹配列表中的所有字符以外的字符
    

    系统中预定义的字符类:man 7 glob

    [:digit:]:任意数字,相当于0-9
    [:lower:]:任意小写字母,表示 a-z
    [:upper:]: 任意大写字母,表示 A-Z
    [:alpha:]: 任意大小写字母
    [:alnum:]:任意数字或字母
    [:blank:]:水平空白字符
    [:space:]:水平或垂直空白字符
    [:punct:]:标点符号
    [:print:]:可打印字符
    [:cntrl:]:控制(非打印)字符
    [:graph:]:图形字符
    [:xdigit:]:十六进制字符
    

    2.8 touch

    touch:创建空文件和改变文件时间

     touch [OPTION]... FILE...
    

    选项:

    • -a 仅改变 atime和ctime
    • -m 仅改变 mtime和ctime
    • -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的时间戳
    • -c 如果文件不存在,则不予创建
    #touch命令最常用的用法就是用来创建空文件
    [root@centos8 data]#touch `date -d "-1 day" +%F_%T`.log
    [root@centos8 data]#ll
    -rw-r--r-- 1 root root   0 Dec  6 22:00 2020-12-05_22:00:15.log
    [root@centos8 data]#touch $(date -d "1 year" +%F_%T).log
    [root@centos8 data]#ll
    -rw-r--r-- 1 root root   0 Dec  6 22:00 2021-12-06_22:00:38.log
    

    2.9 cp

    cp:复制文件或目录

    cp [OPTION]... [-T] SOURCE DEST
    cp [OPTION]... SOURCE... DIRECTORY
    cp [OPTION]... -t DIRECTORY SOURCE...
    alias cp='cp -i'
    

    常用选项

    • -a 归档,相当于-dR --preserv=all,常用于备份功能
    • -i 如果目标已存在,覆盖前提示是否覆盖
    • -r, -R 递归复制目录及内部的所有内容
    • -b 目标存在,覆盖前先备份,默认形式为 filename~ ,只保留最近的一个备份
    • --backup=numbered 目标存在,覆盖前先备份加数字后缀,形式为 filename.# ,可以保留多 个版本
    • -v 显示复制过程
    #复制文件
    [root@centos8 /]# cp -a /root/lx.txt /data/
    [root@centos8 /]# ls /data/
    lx.txt
    #复制目录
    [root@centos8 /]# cp -r /etc/sysconfig/ /data
    [root@centos8 /]# ll /data/
    total 8
    -rw-r--r-- 1 root root  253 Dec  6 21:55 lx.txt
    drwxr-xr-x 6 root root 4096 Dec  6 22:15 sysconfig
    

    2.10 mv

    mv:对文件或目录进行移动和改名

    mv [OPTION]... [-T] SOURCE DEST
    mv [OPTION]... SOURCE... DIRECTORY
    mv [OPTION]... -t DIRECTORY SOURCE...
    

    常用选项

    • -i 交互式
    • -f 强制
    • -b 目标存在,覆盖前先备份

    使用rename可以完成对文件的批量改名

    SYNOPSIS
    rename [options] expression replacement file...
    
    [root@centos8 data]# ls
    file10.txt  file2.txt  file4.txt  file6.txt  file8.txt  lx.txt
    file1.txt   file3.txt  file5.txt  file7.txt  file9.txt  sysconfig
    [root@centos8 data]# rename '.txt' '' *.txt
    [root@centos8 data]# ls
    file1  file10  file2  file3  file4  file5  file6  file7  file8  file9  lx  sysconfig
    [root@centos8 data]# 
    

    2.11 rm

    rm:删除文件或目录

    rm [OPTION]... [FILE]...
    

    常用选项

    • -i 交互式
    • -f 强制删除
    • -r 递归

    删除特殊文件:-f

    1.rm -- -foo
    2.rm ./-foo
    [root@centos8 data]# touch ./-f
    [root@centos8 data]# ls
    -f
    [root@centos8 data]# rm -rf -- -f
    
    

    使用shred可以对磁盘惊醒覆盖,从而彻底删除文件

    2.12 目录命令

    2.12.1 tree:显示目录树

    常用选项

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

    2.12.2 mkdir

    mkdir:创建目录

    常用选项:

    • -v: 显示详细信息

    2.12.3 rmdir

    rmdir:删除空目录,使用较少

    3.EXT文件系统和链接

    3.1文件系统组成

    3.1.1 superblock

    superblock:记录文件系统整体信息,如inode/block的总量、使用量、剩余及档案系统格式等信息

    3.1.2 inode结构

    inode块中保存的是文件的属性信息,包括以下内容

    • inode number 节点号
    • 文件类型
    • 权限
    • UID
    • GID
    • 链接数
    • 文件大小和atime、ctime、mtime
    • 文件内容的真正位置
    • 其他文件相关数据

    3.1.3 目录

    目录是个特殊文件,檔案系統会分配一个 inode 与至少一个 block 给目录。其中,inode 记录目录相关权限与属性,和可分配到的block块的号码; 而 block 则是记录在这个目录下的文件名占用的inode number节点号。

    cp和inode

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

    rm和inode

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

    mv和inode

    • 如果mv命令的目标和源在相同的文件系统,作为mv 命令

      ​ 用新的文件名创建对应新的目录项

      ​ 删除旧目录条目对应的旧的文件名

      ​ 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据 被移动!

    • 如果目标和源在一个不同的文件系统, mv相当于cp和rm

    3.2硬链接

    硬链接本质上就给一个文件起一个新的名称,实质是同一个文件

    2

    硬链接特性

    • 创建硬链接会在对应的目录中增加额外的记录项以引用文件
    • 对应于同一文件系统上一个物理文件
    • 每个目录引用相同的inode号
    • 创建时链接数递增
    • 删除文件时:rm命令递减计数的链接,文件要存在,至少有一个链接数,当链接数为零时,该文 件被删除
    • 不能跨越驱动器或分区
    • 不支持对目录创建硬链接

    为什么不能硬链接目录

    链接目录时会多出一个.,而.又会让目录产生一个新的链接,这会导致错误循环问题

    ln [OPTION]... TARGET... DIRECTORY
    

    3.3符号 symbolic (或软 soft)链接

    一个符号链接指向另一个文件,就像 windows 中快捷方式,软链接文件和原文件本质上不是同一个文件

    2

    软链接特点

    • 可以对目录创建软链接
    • 可以跨分区的文件实现
    • 软链接如果使用相对路径,是相对于原文件的路径,而非相对于当前目录
    • 指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的 引用计数
    • 一个符号链接的内容是它引用文件的名称

    3.4软链接和硬链接的区别

    1. 本质:

      硬链接:本质是同一个文件

      软链接:本质不是同一个文件

    2. 跨区

      硬链接:不支持

      软链接:支持

    3. inode

    硬链接:相同

    软链接:不同

    1. 链接数

      硬链接:创建新的硬链接,链接数会增加,删除硬链接,链接数减少

      软链接:创建或删除,链接数不会变化

    2. 目录

      硬链接:不支持

      软链接:支持

    3. 相对路径

      硬链接:原始文件相对路径是相对于当前工作目录

      软链接:原始文件的相对路径是相对于链接文件的相对路径

    4. 删除源文件

      硬链接:只是链接数减一,但链接文件的访问不受影响

      软链接:链接文件将无法访问

    5. 文件类型

      硬链接:和源文件相同

      软链接:链接文件,和源文件无关

  • 相关阅读:
    PHP 截取字符串专题
    PHP获取文件扩展名的三种方法
    PHP万能密码登陆
    js正则表达式 验证手机号,email地址和邮政编码
    图片局部链接实例,方便自己用!
    通用客户端表单验证函数修正版
    C#事件的知识,转载学习
    C# byte及char FileStream 与StreamReader的区别(转)
    .Net下二进制形式的文件(图片)的存储与读取(转载)
    高斯克吕格坐标系中国部分定义(北京五四和西安80)(转,准确性使用性不敢保证)
  • 原文地址:https://www.cnblogs.com/bestvae/p/14096835.html
Copyright © 2011-2022 走看看