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显示命令在线帮助