文件系统结构说明:
Linux最重要的哲学思想是一切皆文件,Linux将一切资源都归结为文件,那么了也必然将一切资源都纳到一个完整的目录树的文件结构中,文件和目录被组织成一个单根倒置树结构,如下:
Linux的目录结构有一定的规范,特定的目录存放特定的文件,此规范由文件系统层次结构标准(Filesystem Hierarchy Standard)实现,文件系统标准旨在供Linux分发开发人员、程序包开发人员、系统实现都使用,主要是用于参考,面不是如何管理Linux文件系统或目录,或目录层次结构的强制标准。标准文件档参考FHS (Filesystem Hierarchy Standard): http://www.pathname.com/fhs/
文件系统分层结构:LSB Linux Standard Base
文件一般有两类数据:元数据(metadata)、数据(data)
Linux文件结构系统从根目录下开始,用“/” 表示,根文件系统(rootfs)root filesystem。使用/作为路径分隔符,根目录中第一层子目录有:
/boot:引导文件存放目录,内核文件(vmlinuz)、引导加载器(bootloader, grub)都存放于此目录
/bin:所有用户使用的基本命令;不能关联至独立分区,OS启动即会用到的程序
/sbin:管理类的基本命令;不能关联至独立分区,OS启动即会用到的程序
/lib:启动时程序依赖的基本共享库文件以及内核模块文件(/lib/modules)
/lib64:专用于x86_64系统上的辅助共享库文件存放位置
/etc:配置文件目录
/home/USERNAME:普通用户家目录
/root:管理员的家目录
/media:便携式移动设备挂载点
/mnt:临时文件系统挂载点
/dev:设备文件及特殊文件存储位置
b: block device,随机访问
c: character device,线性访问
/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:用于输出当前系统上硬件设备相关信息虚拟文件系统
/selinux: security enhanced Linux,selinux相关的安全策略等信息的存储位置
在CentOS中目录有些变化,如:
/bin 和 /usr/bin
/sbin 和 /usr/sbin
/lib 和/usr/lib
/lib64 和 /usr/lib64
绝对和相对路径
绝对路径:从根目录即以正斜杠开始,完整的文件的位置路径,可用于任何想指定一个文件名的时候
相对路径名,不是从根目录开始,指定相对于当前工作目录或某目录的位置,可以作为一个简短的形式指定一个文件名
基名(整个路径中的文件名):basename
目录名:dirname
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
文件名规则
文件名称区分大小写
以点“.”开头的文件为隐藏文件
文件名最长255个字节
包括路径在内文件名称最长4095个字节
蓝色-->目录、绿色-->可执行文件、红色-->压缩文件 浅蓝色-->链接文件、灰色-->其他文件
除了斜杠和NUL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们
标准Linux文件系统(如ext4),文件名称大小写敏感
例如:MAIL, Mail, mail, mAiL
文件类型
文件各类很多,可以通过“ls -l”查看文件属性,在属性的第一个字符表示文件类型
常见文件类型有:
- 普通文件,一般有纯文本文件、二进制可执行文件、数据格式文件
d 目录文件,即一般的文件夹
b 块设备,就是一些发块为单位访问数据,提供阳春面访问的接口设备,如磁盘、U盘等。
c 字符设备,字符设备文件通常是一些串行接口设备在用户空间的体现,字符设备是按字符为单位且按一定顺序进行输入输出,如键盘、鼠标、终端等
l 符号链接文件,又称为软链接,类似windows系统中的快捷方式
p 管道文件pipe,管道文件是一种特殊的文件类型,其本质是一个伪文件(实为内核缓冲区,主要目的是为了实现进程间通讯(InterProcess Communication,IPC)的问题;遵循先进先出原则,所以又叫FIFO(first in first out)文件.
s 套接字文件socket,被称为数据接口文件,这种类型文件通常被用在基于网络的数据通讯使用。
文件索引节点
磁盘中文件一般有两类数据:元数据(metadata)、数据(data);系统通过文件索引节点编号即inode号找到文件元数据,再能过元数据中的数据块指针找到文件数据。
inode(index node)表中包含文件系统所有文件列表,一个节点 (索引节点)是在一个表项,包含有关文件的信息( 元数据 ),包括:文件类型,权限,UID,GID、链接数(指向这个文件名路径名称个数)、该文件的大小和不同的时间戳、指向磁盘上文件的数据块指针、有关文件的其他数据,使用stat命令查看文件元数据信息,如下
图中,size为文件大小,inode为索引节点,Linds链接数据,第四行Access开关的行有文件类型及权限属性、用户ID、用户组ID、Access为文件访问时间,Modify创建时间,change更新时间;可以通过touch命令修改文件的时间属性
file查看文件类型
文件可以包含多种类型的数据,检查文件的类型,然后确定适当的打开命令或应用程序使用
file [options] <filename>...
常用选项:
-b 列出文件辨识结果时,不显示文件名称
-f filelist 列出文件filelist中文件名的文件类型
-F 使用指定分隔符号替换输出文件名后默认的”:” 分隔符
-L 查看对应软链接对应文件的文件类型
--help 显示命令在线帮助
stat查看文件状态
文件:metadata, data
三个时间戳:
access time 访问时间,atime,读取文件内容
modify time 修改时间, mtime,改变文件内容(数据)
change time 改变时间, ctime,元数据发生改变
文件通配符
* 匹配零个或多个字符 ? 匹配任何单个字符
~ 当前用户家目录 ~mage 用户mage家目录
~+ 当前工作目录 ~- 前一个工作目录
[0-9] 匹配数字范围 [a-z]:字母
[A-Z]:字母 [wang] 匹配列表中的任何的一个字符
[^wang] 匹配列表中的所有字符以外的字符
预定义的字符类:man 7 glob
[:digit:]:任意数字,相当于0-9 [:lower:]:任意小写字母
[:upper:]: 任意大写字母 [:alpha:]: 任意大小写字母
[:alnum:]:任意数字或字母 [:blank:]:水平空白字符
[:space:]:水平或垂直空白字符 [:punct:]:标点符号
[:print:]:可打印字符 [:cntrl:]:控制(非打印)字符
[:graph:]:图形字符 [:xdigit:]:十六进制字符
文件管理相关命令
显示当前工作目录
每个shell和系统进程都有一个当前的工作目录
CWD:current work directory
显示当前shell CWD的绝对路径
pwd: printing working directory
-P 显示真实物理路径
-L 显示链接路径(默认)
tree显示目录树
-C:在文件和目录清单加上色彩,便于区分各种类型
-d: 只显示目录
-D:列出文件或目录的更改时间
-L level:指定显示的层级数目
-P pattern: 只显示由指定pattern匹配到的路径
-p:列出文件的属性
mkdir创建目录
-p: 存在于不报错,且可自动创建所需的各目录
-v: 显示详细信息
-m MODE: 创建目录时直接指定权限
rmdir删除空目录
-p: 递归删除父空目录
-v: 显示详细信息
rm -r 递归删除目录树
cd更改当前目录
使用绝对或相对路径:
cd /home/wang/
cd home/wang
切换至父目录: cd ..
切换至当前用户主目录: cd
切换至以前的工作目录: cd –
选项:-P
相关的环境变量:
PWD:当前目录路径
OLDPWD:上一次目录路径
ls列出目录内容
列出当前目录的内容或指定目录
用法:ls [options] [files_or_dirs]
选项示例
ls -a 包含隐藏文件 ls -l 显示额外的信息
ls -R 目录递归 ls -ld 目录和符号链接信息
ls -1 文件分行显示 ls –S 按从大到小排序
ls –t 按mtime排序 ls –u 配合-t选项,显示并按atime从新到旧排序
ls –U 按目录存放顺序显示 ls –X 按文件后缀排序
touch创建空文件和刷新时间
文件不存在则创建一个新的空文件,如果文件存在则更新文件的时间属性
格式:touch [OPTION]... FILE...
-a 仅改变 atime和ctime
-m 仅改变 mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss],指定atime和mtime的时间戳
-c 如果文件不存在,则不予创建
cp复制文件和目录
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
cp SRC... DEST
SRC... 可以是一个或多个文件或目录,
SRC为文件:如果目标不存在,新建DEST,并将SRC中内容填充至DEST中,如果目标存在,将SRC中的内容覆盖至DEST中,基于安全,建议添加-i选项,避免误操作覆盖掉原有文件;
SRC是目录:此时最好添加-r选项,可以递归复制目录内的文件及目录,如果DEST不存在,则创建指定DEST同名目录,复制SRC目录中所有文件至DEST下;如果DEST存在且为文件,会报错;如果DEST存在且为目录,则在DEST下新建与原目录同名的目录,并将SRC中内容复制至新目录中
DEST 必须存在,且为目录,其它情形均会出错,在DEST下新建与原文件同名的文件,并将SRC中内容填充至新文件中
cp常用选项
-i:覆盖前提示
-n:不覆盖,注意两者顺序
-r, -R:递归复制目录及内部的所有内容
-a:归档,相当于-dR --preserv=all
-d:--no-dereference --preserv=links 不复制原文件,只复制链接名
--preserv[=ATTR_LIST]
mode: 权限
ownership: 属主属组
timestamp:
links
xattr
context
al
-p 等同--preserv=mode,ownership,timestamp
-v –verbose
-f –force
-u --update 只复制源比目标更新文件或目标不存在的文件
-b 目标存在,覆盖前先备份,形式为 filename~
--backup=numbered 目标存在,覆盖前先备份加数字后缀
cp与inode:执行cp时会分配一个空闲的inode号,在inode表中生成新条目,在目录中创建一个目录项,将名称与inode编号关联,拷贝数据生成新的文件
mv移动和重命名文件
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用选项:
-i 交互式
-f 强制
-b 目标存在,覆盖前先备份
示例:
移动文件:mv /etc/fstab /data/
重命名文件:mv /etc/fstab /etc/abc.test
移动并重命名:mv /etc/fstab /data/mount.info
mv和inode:
如果mv命令的目标和源在相同的文件系统,作为mv 命令,用新的文件名创建对应新的目录项,删除旧目录条目对应的旧的文件名,不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
如果目标和源在一个不同的文件系统, mv相当于cp和rm
rm删除
rm [OPTION]... FILE...
常用选项:
-i 交互式,默认选项
-f 强制删除
-r 递归
--no-preserve-root 删除/
示例:
强制删除:rm -rf /*
rm与inode:执行rm命令,文件链接数递减,从而释放的inode号可以被重用,把数据块放在空闲列表中,删除目录项,数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
ln创建链接文件
ln [option] … [-T] TARGEG LINK_NAME
ln [option]… TARGET
ln [option]… TARGET… DIRECTORY
ln [option]… -t DIRECTORY TARGET…
TARGET表示需要创建链接文件的目标文件,LINK_NAME表示生成的链接文件
常用选项:
-b:覆盖前先备份
-d,-F, --directory:允许超级用户制作目录的硬链接,因系统限制可能出错
-f,--force:强制执行
-I,--interactive:交互模式,文件存在则提示用户是否覆盖
-n,--no-dereferenc:把符号链接视为一般目录
-v,--verbose:显示与详细的处理过程
-S,--suffix=SUFFIX:指定备份的文件后缀
--help:显示帮助信息
--version:显示版本信息
硬链接与软链接
硬链接:其本质就是对同一个文件起多个文件名,所有指向同一文件的硬链接与源文件使用同一个Inode号,但每创建一个硬链接会使用文件的链接数据加1;在删除文件时,无论是删除文件最初的文件名或某个硬链接,则链接数据减1,文件数据不一定会被删除,只有当文件链接数据为0时,文件才会被删除;硬链接不能跨越驱动器或分区,
创建硬链接:ln filename [linkname ]
flename 为硬链接名,linkname为源文件
硬链接特性:
1、文件有想再的inode号及数据块
2、只能对已存在的文件进行创建
3、不能跨分区创建硬链接
4、对目录进行创建,只可对文件创建
5、删除一个硬链接文件并不影响其他有相同Inode号的文件
示例:ln pass.link /etc/passwd
符号(或软)链接
若文件用户数据块中存放的内容是另一个文件的路径名的指向,那么这个文件应该就是软链接文件;软链接就是一个普通的文件,拥有自己的inode号及用户数据块。类似于windows系统中的快捷方式。
创建硬链接:ln -s filename [linkname]
flename 为源文件,linkname为链接文件名
软链接特性:
1、链接文件有自己的文件属性及权限等
2、可对不存在的文件或目录创建软链接
3、软链接可跨分区
4、软链接可以对文件或目录创建
5、创建软链接时,原文件链接计数不会增加
6、删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关的软链接将无法访问,被称为死链 接,如果文件被重新创建,则链接又会恢复访问,但访问的是新创建的文件
下面是一些小练习:
1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录
答:ls /etc/l*[[:digit:]]*[[:lower:]]
2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录
答:ls /etc/[[:digit:]]*[^[:digit:]]
3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录
答:ls /etc/[^[:alpha:]][[:alpha:]]*
4、显示/etc/目录下所有以rc开头,并后面是0-6之间的数字,其它为任意字符的文件或目录
答:ls /etc/rc[0-6]*
5、显示/etc目录下,所有以.d结尾的文件或目录
答:ls /etc/*.d
6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录
答:ls /etc/[mnrp]*.conf
7、只显示/root下的隐藏文件和目录
答:ls -d /root/.*
8、只显示/etc下的非隐藏目录
答:ls -d /etc/*/
9、每天将/etc/目录下所有文件,备份到/data独立的子目录下,并要求子目录格式为 backupYYYY-mm-dd,备份过程可见
答:cp -rf /etc/ /data/backup`date "+%F"`
10、创建/data/rootdir目录,并复制/root下所有文件到该目录内,要求保留原有权限
答:cp -arf /root/ /data/rootdir/
11、如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a,/testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b
答:mkdir -p /testdir/dir1/{x,y}/{a,b}
12、如何创建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b
答:mkdir -p /testdir/dir2/{x/{a,b},y}
13、如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
答:mkdir -p /testdir/dir{3,4,5/dir{6,7}}