今天呢,我首先要来介绍linux的文件系统,linux系统当中的文件和目录被组织成一个单根倒置树状结构,从根目录下爱是,都用“/”表示,根文件系统(rootfs):root filesystem ,在linux文件系统中名称是大小写敏感的,严格区分大小写,以“.”开头的文件称之为隐藏文件,路径的分隔符是"/"。

 文件有两类数据:

   元数据:metadata,指的是文件的大小,时间戳,属主数组等信息

   数据:data,文件的内容

   文件系统分层结构:LSB    Linux  Standard  Base,这是一个由名叫LSB的组织定义的linux

发行版基础目录名称命令法则及功用规定,这种标准就叫做FHS(Filesystem  Hierarchy  Standard)


文件名规则

   长度不能超过255个字符

   不能使用“/”当文件名

   严格区分大小写(对文件系统而言,而不是对于linux)


文件系统结构

/boot:系统启动相关文件,内核文件(vmlinuz)、引导加载器(bootloader,grub)都存放在此目录当中

/dev:设备文件该文件颜色为面黄底黑

    块设备:block device 随机访问数据块

    字符设备:character device 线性访问,按字符为单位

/etc:配置文件目录

/home :普通用户家目录,默认为/home/usrname

/bin:供所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序

/sbin:管理类的基本命令;不能关联到独立分区,OS启动即会用到的程序

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

  静态库  .a

  动态库 .dll   .so(shared  boject)

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

/media:便携式移动设备挂载点   优盘,光盘

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

/root:管理员的家目录

/opt:可选目录,第三方应用程序的安装目录

/srv:系统上运行的服务用到的数据

/tmp:临时文件存储位置

/usr:universal  shared ,read-only data

   bin:保证系统拥有完整功能而提供的应用程序

   sbin:

   lib:32位使用

   lib64:只存在64位系统

   include:C程序的头文件(header files)

   share:结构化独立的数据,例如doc,man等

   local:第三方应用程序的安装诶之

/var:variable data file 可变化的文件

     cache:应用程序缓存数据目录

     lib:应用程序状态信息数据

     local:专用于/usr/local下的应用程序存储可变数据;

     lock:锁文件

     log:日志目录及文件

     opt:专用于为/opt下的应用程序存储可变数据

     run:运行中的进程相关护具;通常用于存储进程pid文件

     spool:应用程序数据池

     tmp:保存系统两次重启之间产生的临时数据

/proc:伪文件系统,内核 映射文件

/sys:伪文件系统,跟硬件设备相关属性映射文件

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

linux文件管理_linux


linux上的应用程序的组成部分

  二进制程序:/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


file  system  type

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

linux文件管理_文件管理_02


显示当前工作目录

    每个shell和系统进程都有一个当前的工作目录,CWD:current work directory
    显示当前shell CWD的绝对路径
    pwd: printing working directory

    pwd -P     对于链接文件来说,显示源文件的目录位置,比如/etc/init.d这个目录时链接到/etc/rc.d/int.d的这个目录,当我执行 cd -P    /etc/init.d那么我将会进到/etc/rc.d/init.d

linux文件管理_linux_03


绝对路径和相对路径

  绝对路径:
  以正斜杠开始(从根目录开始)
  完整的文件的位置路径

  相对路径:

  不以斜线开始
  指定想定于当前工作目录或某目录的位置,例如链接,在创建链接文件时,是以链接文件的当前     目录创建链接文件的
  可以作为一个简短的形式指定一个文件名

        

cd(change directory)

  为绝对路径或相对路径
  cd ..  到上一级目录      

  cd     回到你的主目录       
  cd  -   到以前的工作目录

举例:假如我现在在/tmp目录下我cd ..之后我就到根目录下了,我执行cd命令将会回到用户家目录下,我再执行cd -之后我就会回到上一次的工作目录也就是根目录

      linux文件管理_linux_04

相关的环境变量
  PWD:保存了当前目录路径
  OLDPWD:上一次所在目录路径
  cd -P  对链接的目录来说,回到原文件目录的位置
  linux文件管理_linux_05          

 ls列出当前目录的内容或指定目录
    用法:
 ls [options] [files_or_dirs]
   -a 包含隐藏文件

    ls -a  /etc/

   -l 显示额外的信息

    ls -l  /etc/

   -R 目录递归通过

   ls  -R  /etc/

   -r 逆序排列文件

   ls  -r  /etc/

  -ld 目录和符号链接信息

   ls -ld  /etc/

  -1(数字) 文件分行显示

  ls -1  /etc/

  -Z 显示文件的context值 

  ls  -Z   filename     

   -i    显示文件inode号 

  ls -i  filename


stat查看文件状态

stat [OPTION]... FILE..

  三个时间戳:

  access  time:访问时间,atime

  modify time:修改时间,mtime

  change time:改变时间,ctime


centos6/7读某个文件atime不是立马更改而是当文件超过一天了,就需要改变,还有一种情况就是当atime比mtime旧的时间
                
文件通配符
  * 匹配零个或多个字符(任意长度的任意字符)
  ? 匹配任何单个字符(任意单个字符)
  ~ 当前用户家目录
  ~ username 用户家目录
  ~+ 当前工作目录
  ~- 前一个工作目录
  [0-9] 匹配一个数字范围
  [a-z]:大写和小写字母
  [A-Z]:大写字母
  [abc] 匹配列表中的任何的一个字符
  [^abc] 匹配列表中的所有字符以外的字符
  [:digit:]任意数字,相当于0-9
  [:lower:]:任意小写字母
  [:upper:]:任意大写字母
  [:alpha:]:任意大小写字母
  [:alnum:]:任意数字和字母
  [:space:]:空格
  [:punct:]:标点符号


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

  ls  -d  /var/l*[[:digit:]]*[[:alpha:]]


2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录

 ls  -d /etc/[[:digit:]]*[^[:digit:]]


3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录

 ls    -d /etc/[^[:alpha:]][[:alpha:]]*


4、显示/etc目录下所有以m开头以非数字结尾的文件或目录

 ls  -d /etc/m*[^[:digit:]]


5、显示/etc目录下,所有以.d结尾的文件或目录

 ls -d /etc/*.d


6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文查看文件状态stat

  ls -d /etc/[mnrp].conf|stat


 stat
   文件:metadata, data
   三个时间戳:
   access time:访问时间,atime,读取文件内容
   modify time: 修改时间, mtime,改变文件内容(数据)
   change time: 改变时间, ctime,元数据发生改变
        
touch命令
    touch [option]...file
     -a:仅改变atime

    touch -a  filename

     -m:仅改变mtime

    touch -m  filename

    -t:STAMP:
    [[cc]yy]MMDDhhmm[.ss]
    -c:如果文件不存,则不予创建
            
复制文件和目录

    cp [OPTION]... [-T] SOURCE DEST

    cp SRC DEST    
    cp  file1    file2(只能一个文件到一个文件)

    cp  file1 file2 dir2/(多个文件到一个目录)

    -i:交互式(当目标文件存在时会提示你是否覆盖)
    -r, -R: 递归复制目录及内部的所有内容(一同某目录下文件和目录)
   -a:保存文件的所有属性(常用语备份归档)
   -d:--no-dereference --preserv=links 不复制原文件,只复制链接名
   -m   mode: 权限
   ownership: 属主属组
   timestamp:时间戳
   links:链接 

   context:context值
   all
   -p: 等同--preserv=mode,ownership,timestamp保持原有属性属主权限时间戳
   -v: --verbose  显示复制过程
   -f: --force 强制复制

   cp  /etc/{passwd,issue,inittab}  /tmp/

linux文件管理_linux_06

 linux文件管理_文件管理_07


命令别名
   显示当前shell进程所有可用的命令别名
    alias

    定义别名为name,其他相当于执行命令value
    alias name=‘value’

linux文件管理_linux_08

  在命令行中定义的别名,仅对当前shell进程有效
  如果想永久有效,要定义在配置文件中
   仅对当前用户:~/.bashrc
   对所有用户有效:/etc/bashrc
   编辑配置给出的新配置不会立即生效;
   bash进程重新读取配置文件:
   source  /path/to/config_file
   .   /path/to/config_file
   撤消别名:unalias
   unalias [-a] name [name ...]

   unalias cdnet

   如果别名同原命令同名,如果要执行原命令,可使用
 “\COMMAND”
   'COMMAND’
   /PATH/COMMAND:外部命令

            
mv移动和重命名文件
  mv [OPTION]... [-T] SOURCE DEST
  常用选项

  - i: 交互式(移动是当有重名的文件时会提示是否覆盖)

  mv   file1    /tmp/file1(当/tmp目录下存在一个名为file1的文件就会提示)

  -f: 强制(不提示是否覆盖直接移动)

  mv -f file1  /tmp/file1

     linux文件管理_linux_09 


rm删除
   rm [OPTION]... FILE...
   常用选项:
   -i: 交互式(默认是创建了别名)

   -f: 强制删除
   -r: 递归
   --no-preserve-root 在root用户下删除所有文件(在红帽5时时可以直接删除哦,按后来哦系统版本加强了安全性是不能直接删除的必须加这个选项才能直接删除)
      例: #rm -rf /
            
目录操作
   tree 显示目录树
   -d: 只显示目录
   -L level:指定显示的层级数目
   -P pattern: 只显示由指定pattern匹配到的路径
   -p: 存在于不报错,且可自动创建所需的各目录;
   -v: 显示详细信息
   -m MODE: 创建目录时直接指定权限;
     linux文件管理_linux_10     

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

linux文件管理_linux_11

       
rmdir 创建目录,只能删除空目录

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

   rm -r 递归删除目录树

     linux文件管理_文件管理_12


索引节点

   表中包含文文件系统所有文件列表,它是一种数据结构,它包含文件系统和文件之间一些重要的信息,在创建文件系统时会创建大量的inode,一个节点是在一个表项,包含有关文件的信息(元数据),包括:

   文件类型,权限,UID,GID 链接数(指向这个文件名路径名称个数)

   该文件的大小和不同的时间戳

   指向磁盘上文件的数据块指针

   有关文件的其他数据


 inode表结构

linux文件管理_文件管理_13


目录

   文件引用一个是inode号,人是通过文件名来引用一个文件,一个目录时目录下的文件名和文件inode号之间的映射

linux文件管理_linux_14

inode表

   inode 表包含一份清单,其中列出了对应文件系统的所有 inode 编号。当用户搜索或者访问一个文件时, 系统通过 inode 表查找正确的 inode 编号。在找到 inode 编号之后,相关的命令才可以访问该 inode ,并对其进行适当的更改。


cp和inode

  当复制文件时,系统会分配在一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将名称与inode号编号关联拷贝数据生成的文件。


rm和inode

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


mv和inode

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


硬链接

  创建硬链接会增加额外的记录项以引用文件

  对应同一文件系统上一个物理文件

  每个目录引用相同inode号

  创建时链接数递增

  删除文件时:        

  rm命令递减计数的链接

  文件要存在,至少有一个链接数

  当链接数为零时,该文件被删除

  不能跨分区

  语法

  ln   filename   linkname

linux文件管理_文件管理_15


$符号(软)链接

   一个符号链接指向另一个文件

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

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

   可以对目录进行

   可以跨分区

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

  语法:

  ln   -s  filename        linkname

linux文件管理_文件管理_16


file确定文件内容

  文件可以包含多种类型的数据

  检查文件类型,然后确定适当的开房命令或应用程序使用

  file  [options]<filename>

   option:

   -b列出文件辨识结果时,不显示文件名称。
   -c详细显示指令执行过程,便于排错或分析程序执行形
   -f列出文件中文件名的文件类型
   -F使用指定分隔符号替换输出文件名后默认的”:”分隔符
   -i输出mime类型的字符串
   -L查看对应软链接对应文件的文件类型
   -z尝试去解读压缩文件的内容
   --help显示命令在线帮助

   


         

习题:说说软硬链接的区别

1、硬链接只能对文件 创建不能对目录创建,而软链接可以对目录和文件创建链接

2、硬链接不能跨文件系统跨分区,而软链接可以跨文件系统和分区

3、硬链接创建链接会增加文件的链接数,而软链接不会增加链接数

4、如何创建/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/{a,b},y/{a,b}}


5、 如何创建/testdir/dir2/x, /testdir/dir2/y,/testdir/dir2/x/a, /testdir/dir2/x/b

   mkdir -pv  /testdir/dir2/{x/{a,b},y}


6、 如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5,/testdir/dir5/dir6, /testdir/dir5/dir7

   mkdir -p /testdir/dir{3,4,5/dir/{6,7}}