Linux系统下的文件管理


文件系统:

文件和目录被组织成一个单根倒置树结构;

文件系统从根目录下开始,用/表示;

根文件系统;

名称是大小写敏感;

以.开头的文件为隐藏文件;

路径分隔使用/

文件有两类数据:

元数据:metadata

数据:data

文件系统分层结构:LSB(Linux Standard Base)

FHS;


FHS:  提起Linux系统的文件系统,我们首先要知道

                Filesystem Hierarchy Standard(文件系统目录标准),简称FHS

多数Linux版本采用了这种文件组织形式,

                类似于Windows操作系统中c盘的文件目录,

                FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途

、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。


文件名规则:


1.包括路径在内文件名称最长4095个字节,用/分隔的路径不能超过255个字节。


2.除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,

                  有些字符需要用引号来引用它们。


3.标准Linux文件系统(如ext4),文件名称大小写敏感。

                  例如:MAIL,Mail,mail, mAiL


4.蓝色-->目录

 绿色-->可执行文件

 红色-->压缩文件

 浅蓝色-->链接文件

 灰色-->其他文件


下面我们来看看文件具体的文件系统结构:

/bin:所有用户使用的基本命令程序文件;

/sbin:供系统管理使用的工具程序;

/boot:引导加载器必须用到的各静态文件:kernel,initrafd(initrd),grub等;

/dev:存储特殊文件和设备文件;

                    设备有两种类型:字符设备(线性设备)、块设备(随机设备);

/etc:系统程序的配置文件,只能为静态;

/home:普通的家目录的集中位置;

                     一般每个普通用户的家目录默认为此目录下与用户名同名的子目录,/home/USERNAME;

/root:管理员的家目录;可选;

                /lib:为系统启动或根文件系统上的应用程序(/bin,/sbin)提供共享库,

                     以及为内核提供内核模块

    libc.so.*:动态链接的C库;

    ld*:运行时链接器/加载器;

    modules:用于存储内核模块的目录;

/lib64:64位系统特有的存放64位共享库的路径;

/media:便携式设备挂载点,cdrom,floppy等;

/mnt:其他文件系统的临时挂载点;

                /opt:附加程序的安装位置;可选路径;

/srv:当前主机为服务提供的数据;

/tmp:为那些会产生临时文件的程序提供的用于存储临时文件的目录;

                     可供所用户执行写入操作;有特殊权限;

/usr:usr Hierarchy,全局共享的只读数据路径;

bin,sbin

lib,lib64

include:C程序头文件;

share:命令手册页和自带文档等架构特有的文件存放位置

local:另一个层级目录;

X11R6:X-window程序的安装位置

src:程序源码文件的存储位置

/usr/local:local hierarchy,让系统管理员安装本地应用程序;

                        也通常用于安装第三方程序;

/var:var hierarchy,存储经常发生变化的数据的目录;




/proc:基于内存的虚拟文件系统,用于为内核及进程存储其相关信息;

                      它们多为内核参数,

/sys:sysfs虚拟文件系统提供了一种比proc更为理想的访问内核数据的途径;

                    其主要作用在于为管理linux设备提供一种统一模型的接口;


Linux系统下的文件类型:

-:普通文件

d:目录文件

b:块设备

c:字符设备

|:符号链接文件

p:管道文件pipe

s:套接字文件socket


在每个shell和系统进程中都会有一个当前所处的工作目录CWD:current work directory,

        显示当前shell CWD的绝对路径我们可以使用pwd命令:printing working directory


刚刚我们讲到了绝对路径这个概念,那么下面我们讲一下绝对路径和相对路径

绝对路径:

以/开始完整的文件的位置路径,可用于任何想指定一个文件名的时候;

相对路径:

不以/开始,指定相对当前的工作目录位置,

                        可以作为一个简短的形式指定一个文件名


目录管理类操作:

cd:改变工作目录

可以是绝对路径或相对路径;

cd.. :到上一级目录

cd:回到用户的家目录

cd -:到上次工作目录

相关的环境变量:

PWD:保存了当前目录路径

OLDPWD:上一次所在目录路径;


ls:列出目录内容  list directory contents

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

-a:包含包含隐藏文件

-l:显示额外的信息

-R:目录递归显示

-ld:目录和符号链接信息

-1:文件分行显示

-S:从大到小排序

-u:配合-+选项,显示并按atime从新到旧排序

-U:不排序按目录存放顺序显示


    讲到ls命令,我们就有必要说一下文件通配符,将命令与通配符结合能实现诸多功能;

文件通配符:

*:匹配零个或多个字符

?:匹配任何单个字符

~:当前用户家目录

~username:指定用户家目录

~+:当前工作目录

~-:前一个工作目录

[0-9]:匹配一个数字范围

[a-z]:大写和小写字母

[A-Z]:大写字母

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

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

预定义的字符类:#man 7 glob

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

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

[:upper:]: 任意大写字母

[:alpha:]: 任意大小写字母

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

[:space:]:空格

[:punct:]:标点符号


stat:查看文件状态 display file or file system status

stat FILE...


文件:两类数据

元数据:metadata

数据:data

文件的三个时间戳:

access time:访问时间,atime,读取文件内容

modify time: 修改时间, mtime,改变文件内容(数据)

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


touch:创建空文件和刷新时间 change file timestamps


 touch [OPTION]... FILE...

-c:指定的文件路径不存在时不予创建;

-a:仅修改access time;

-m:仅修改modify time;

-t STANMP

[[CC]YY]MMDDhhmm[.ss]


cp命令:copy   源文件:目标文件:


单源复制:cp [OPTION]... [-T] SOURCE DEST

       多源复制:cp [OPTION]... SOURCE... DIRECTORY

         cp [OPTION]... -t DIRECTORY SOURCE...


        单源复制:cp [OPTION]... [-T] SOURCE DEST

        如果DEST不存在,则事先创建此文件,并复制源文件的数据流至DEST中;

        如果DEST存在:

          如果DEST存在是非目录文件:则覆盖目标文件;

          如果DEST是目录文件:则先在DEST目录下创建一个与源文件同名的文件,

                                              并复制其数据流;


       多源复制:cp [OPTION]... SOURCE... DIRECTORY

         cp [OPTION]... -t DIRECTORY SOURCE...


       如果DEST不存在:错误;

       如果DEST存在:

       如果DEST是非目录文件:错误;

       如果DEST是目录文件:分别复制每个文件至目标文件中,

                                并保持原名;


       常用选项:

       -i:交互式复制,既覆盖之前提醒用户确认;

       -f:强制覆盖目标文件;

       -r;递归复制目录;

       -d:复制符号链接文件本身,而非其指向的源文件;

       -a;-dR --preserve=all,archive,用于实现归档;

       --preserv=

       mode:权限

       ownership:属主和属组

       timestamps:时间戳

       context:安全标签

       xattr:扩展属性

       links:符号链接

       all:上述所有属性


       alias:命令别名

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

#alias

定义别名NAME,其相当于执行命令VALUE;

#alias NAME='VALUE'

在命令行中定义的别名,仅对当前shell进程有效

如果想永久有效,要定义在配置文件中

仅对当前用户:~/.bashrc

对所有用户有效:/etc/bashrc

编辑配置给出的新配置不会立即生效;

bash进程重新读取配置文件:

source /path/to/config_file

. /path/to/config_file

撤消别名:unalias

unalias[-a] name [name ...]

如果别名同原命令同名,如果要执行原命令,可使用

“\COMMAND”

'COMMAND'

/PATH/COMMAND:外部命令


mv命令:move

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

        mv [OPTION]... SOURCE... DIRECTORY

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


         常用选项:

         -i;交互式;

         -f;fouce


         rm命令:remove

         rm [OPTION]... FILE...


         常用选项:

         -i:interactive

         -f:force

         -r:recursive


         删除目录:rm -rf /PATH/TO/DIR

         危险操作:rm -rf /*


         注意:所有不用的文件建议不要直接删除,而是移动至某个专用目录;

                    (模拟回收站)


        最后我们可以总结下常用的目录操作:

tree 显示目录树

-d: 只显示目录

-L level:指定显示的层级数目

-P pattern: 只显示由指定pattern匹配到的路径

mkdir创建目录

-p: 存在于不报错,且可自动创建所需的各目录;

-v: 显示详细信息

-m MODE: 创建目录时直接指定权限;

rmdir删除空目录

-p: 递归删除父空目录

-v: 显示详细信息

rm-r递归删除目录树


索引节点:

     索引节点是指在许多类unix文件系统中的一种数据结构。每个索引点保存了文件系统中的一个文件系统对象的元信息数据,但不包括数据内容或者文件名。

    索引节点的创建,首先需要明白的是,在unix操作系统中的任何资源都被当做文件来管理。

    

inode(index node)表中包含文件系统所有文件列表,一般inode会占用磁盘空间的1%

一个节点(索引节点)是在一个表项,包含有关文件的信息(元数据),包括:

文件类型,权限,UID,GID

链接数(指向这个文件名路径名称个数)

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

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

有关文件的其他数据


文件和目录与inode的关系:

文件的引用实际上就是引用了一个inode号

一个目录是目录下的文件名和文件inode号之间的映射


cp命令和inode:

分配一个空闲的inode号,在inode表中生成新条目

在目录中创建一个目录项,将名称与inode编号关联

拷贝数据生成新的文件


rm命令和inode:

链接数递减,从而释放的inode号可以被重用

把数据块放在空闲列表中

删除目录项

数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖。


mv命令和inode:

如果mv命令的目标和源在相同的文件系统,作为mv命令用新的文件名创建对应新的目录项

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

mv命令并不影响inode表(除时间戳)或磁盘上的数据位置,

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


硬链接:

硬链接就是一个或多个文件名,通常来说,一个文件有几个文件名我们就说该文件的链接数为几,总之,硬链接就是让多个不在或者同在一个目录下的文件名,同时能够修改同一文件,当其中一个修改后,所有与其硬链接的文件都一起修改了。硬链接只能是在同一分区内。

语法:ln filename [linkname]


软链接:

所谓软链接说白了就是文件的快捷方式,当文件本身被移动或删除时,软链接也随之失效。软链接可以跨分区创建。

语法:ln -s filename [linkname]


确定文件内容:

之前我们说到过在Linux系统中,文件具有多种类型,在这里我们在回顾一下:

-:普通文件

d:目录文件

b:块设备

c:字符文件

l:符号链接文件

p:管道文件

s:套接字文件


在Linux系统中,我们通常要先确定文件的类型,然后确定适当的开放命令或应用程序的使用

我们可以使用file命令来查看文件类型

file [option] <filename>...

    

    Option:

    -b列出文件辨识结果时,不显示文件名称。

    -c详细显示指令执行过程,便于排错或分析程序执行

    -f列出文件中文件名的文件类型

    -F使用指定分隔符号替换输出文件名后默认的”:”分隔符

    -i输出mime类型的字符串

    -L查看对应软链接对应文件的文件类型

    -z尝试去解读压缩文件的内容

    --help显示命令在线帮助