- 1. 文件系统图
- 2. linux下的文件类型
- 3. 文件系统结构 (linux各个文件目录简单介绍)
- 4. 文件名命名规则和颜色特征—{/etc/DIR_COLORS}
- 5. 绝对路径和相对路径—{basename,dirname}
- 6. 显示当前工作目录—{pwd}
- 7. 更改当前所在目录—{cd,$PWD,$OLDPWD,..和-和.}
- 8. 列出目录文件内容—{ls,l.}
- 9. 查看文件状态—{stat}
- 10. 文件通配符
- 11. 创建空文件和刷新时间—{touch}
- 12. 复制文件和目录—{cp,scp}
- 13. 移动和重命名文件—{mv}
- 14. 删除—{rm}
- 15. 目录操作—{tree,mkdir,rmdir,rm -r}
- 16. 索引节点
- 17. 目录文件(文件夹)
- 18. cp和inode
- 19. rm和inode
- 20. mv和inode
- 21. 硬链接—{ln}
- 22. 软链接—{ln -s,readlink}
- 23. 软硬链接的区别总结:
- 24. 确定文件内容—{file}
1. 文件系统图

- 文件和目录被组织成一个单根倒置树结构
- 文件系统从根目录下开始,用“/”表示
- 根文件系统(rootfs):root filesystem
- 文件名称区分大小写(主要是和文件系统有关,并非是linux本身的关系)
- 以.开头的文件为隐藏文件
- 路径分隔的 /
- 文件有两类数据:
- 元数据:metadata
- 数据:data
- 文件系统分层结构:LSB Linux Standard Base
- FHS: (Filesystem Hierarchy Standard)
2. linux下的文件类型
2.1. 可以用ll查看,在ll列表最前面的一个字母表示
- -:普通文件
- d:目录文件
- b:块设备,以block块形式存储;随机访问
- 比如最典型的硬盘就是一块一块写(看设置的最小单位是什么,比如说系统硬盘格式化时设置的最小单位是1k也就是1024字节,每次写的时候都是以1024个字节为最小单位来写入数据的)
- 写入时随机寻找一块位置存放数据,一般都是有缓冲区的(先写入buffer缓冲区,注意和cache缓存的区别),读取的时候也是可以随机读取任何一块块设备位置内的数据的。
- 缓存或者缓冲的共同目的都是为了加快读写速度,进行各种优化;其速度比硬盘快,提高效率;
- 但两者也有很大区别:简单来说buffer像一个箱子,填满了之后一并写入硬盘,起到减少IO读写次数的流量整流的作用;而cache则是为了满足高速设备和低速设备之间速度的不同引入的一个中间层,为了提高它们之间进行数据交换的速度。
- 更加详细查看https://www.zhihu.com/question/26190832)
- c:字符设备,以字符character形式存储和读写;线性访问
- 比如键盘设备输入就是一个字符一个字符写,是按照次序输入的,不是随机,一般都没有缓存;读取的时候也必须从设备(文件)从头开始一个字符一个字符的读取
- linux里面的
/dev/zero就是全为0的字符设备
- l:符号链接设备
- p:管道文件pipe,用于不同软件或者程序传播文件或者数据用,只能单向传输,现在很少用
- s:套接字文件socket,可以双向同时传输
2.2. 内存(用户内存区和内核内存区)缓存区图解:

2.3. 管道文件和socket文件图解:

3. 文件系统结构 (linux各个文件目录简单介绍)
- /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相关的安全策略等信息的存储位置
4. 文件名命名规则和颜色特征—{/etc/DIR_COLORS}
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 文件名不同颜色代表不同类型的文件
- 白色–>普通文件
- 蓝色–>目录
- 绿色–>可执行文件
- 红色–>压缩文件
- 红色闪烁–>表示链接的文件有问题
- 黄色–> 设备文件
- 浅蓝色–>链接文件
- 灰色–>其他文件
- 文件的不同后缀可以显示不同的颜色,可以自己定义,在/etc/DIR_COLORS
- 除了斜杠和NUL,所有字符都有效,可以用来做文件名.
- 但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用它们,比较麻烦,所以一般不这么用;
- 标准Linux文件系统(如ext4),文件名称大小写敏感
- 例如:MAIL, Mail, mail, mAiL
4.0.1. 注意点1:
- 文件的不同后缀可以显示不同的颜色,可以自己定义,在/etc/DIR_COLORS
- 文件名可以用-等等特殊符号,但是最好别用,创建或者删除的时候必须用路径的方式才能创建或者删除 touch /data/ -a
- /proc和/sys是两个虚拟文件系统的目录,并不真实存在于物理磁盘上面;其中前者表示关于内核和进程的各种虚拟文件系统,后者表示关于系统中各种硬件的虚拟文件系统。
- 如果自己想要存储暂时的数据,也可以自己创建个文件在这两个文件夹里面,当系统重启的时候,这两个文件夹内的内内容就会丢失并重新生成;
- 但默认的时候就算是root用户也没有权限写入内容到这两个文件夹内,因此需要自己先进行特殊权限修改才可。
5. 绝对路径和相对路径—{basename,dirname}
5.1. 绝对路径
以正斜杠开始 完整的文件的位置路径 可用于任何想指定一个文件名的时候
5.2. 相对路径名
不以斜线开始 指定相对于当前工作目录或某目录的位置 可以作为一个简短的形式指定一个文件名
5.3. 基名:basename
5.4. 目录名:dirname
6. 显示当前工作目录—{pwd}
- 每个shell和系统进程都有一个当前的工作目录
- CWD:current work directory
- 显示当前shell CWD的绝对路径
- pwd: printing working directory
- -P 显示真实物理路径
- -L 显示链接路径(默认)
- pwd: printing working directory
7. 更改当前所在目录—{cd,$PWD,$OLDPWD,..和-和.}
- 使用绝对或相对路径:
- cd /home/wang/
- cd home/wang
- 切换至父目录:
- cd ..
- 切换至当前用户家目录:
- cd [~]
- 切换到其他用户家目录:
- cd ~USERNAME
- 切换至以前的工作目录:
- cd –
- 这个命令利用的就是OLDPWD这个变量,如果自己手动修改了OLDPWD变量内容,则它也就会进入自己修改后的变量内容的目录中去了;
- 选项
-L:显示包括链接在内的环境变量,pwd命令默认就自带了-L选项,自己不用输入
-P:忽略各种链接,直接显示真实的当前目录
7.1. 相关的环境变量:
- PWD:当前目录路径
- OLDPWD:上一次目录路径
8. 列出目录文件内容—{ls,l.}
- 列出当前目录的内容或指定目录
- 用法:
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 按文件后缀排序
8.1. ls的一些其他用法
注意,ls默认的排序是按照列来排序的,从上往下,然后第一列排完之后从左往右排第二列;
同时ls的默认排序并不是按照ASCII码的顺序进行排序的,而是按照字母表的顺序
同时它排序的时候不区分大小写,并且把数字放在最前面排序。
ls -t 以mtime修改时间来进行排序,但不现实详细的信息
ls -lt 以mtime修改时间来进行排序,同时显示出mtime(当然默认加了-l之后显示的就是mtime)而不是默认的名称排序
ls -c 以ctime排序而不是以默认的名称进行排序,但是不现实详细的信息(包括ctime等等)
ls -lc 显示ctime而不是默认的mtime,但仍旧以名称排序
ls -lct 显示ctime而不是默认的mtime,同时按照ctime来排序
ls -u 以atime排序而不是以默认的名称进行排序,但是不现实详细的信息(包括ctime等等)
ls -lu 显示atime而不是默认的mtime,但仍旧以名称排序
ls -lut 显示atime而不是默认的mtime,同时按照ctime来排序
注意上面的 -c选项可以完全等价用 --time=ctime或者status
-u选项则 完全等价用 --time=atime或者access或者use
其他的用法和短参数完全一样;
8.2. l.=ls -d .*
9. 查看文件状态—{stat}
- 文件:metadata, data
- 三个时间戳:
- access time 访问时间,atime,读取文件内容
- modify time 修改时间, mtime,改变文件内容(数据)
- change time 改变时间, ctime,元数据发生改变
9.0.1. 注意点2:
- ctime改变表示文件的元数据最近一次发生改变的时间,而元数据包括文件的权限,所属者,inode编号等等这些内容;也就是inode内的信息
10. 文件通配符
* 匹配零个或多个字符
? 匹配任何单个字符
~ 当前用户家目录
~zhang 用户zhang家目录
~+ 当前工作目录
~- 前一个工作目录
[0-9] 匹配数字范围,但要注意只是匹配范围中的任意一个字符
[a-z]: 字母范围 ,同上只是匹配一个字符
[A-Z]: 字母范围,同上只是匹配一个字符
[zhang] 匹配列表中的任何的一个字符
[^zhang] 匹配列表中的所有字符以外的任何一个字符
预定义的字符类:man 7 glob
[:digit:] 任意数字,相当于0-9
[:lower:] 任意小写字母
[:upper:] 任意大写字母
[:alpha:] 任意大小写字母
[:alnum:] 任意数字或字母
[:blank:] 水平空白字符
[:space:] 水平或垂直空白字符
[:punct:] 标点符号
[:print:] 可打印字符
[:cntrl:] 控制(非打印)字符
[:graph:] 图形字符
[:xdigit:] 十六进制字符
注意在通配符中使用预定义的字符类的时候要在外面再加一层中括号(看起来有两层中括号)
比如 ls f[[:upper:]].txt 等
当然预定的通配符可以多个同时使用,
比如说 ls f[[:upper:][:digit:]].txt 等
10.0.1. 注意点3:
- 注意
*不匹配隐藏文件,它可以代表0个或者任意个字符,而?代表一个字符,汉字也是一个字符 - 切换文件夹可以用
cd -,但是如果访问文件只能cd ~-/#### - 通配符都是匹配文件名字的(filename),其文件中的内容不能匹配
- 中括号通配符匹配内只取一个字符,花括号相当于拆开的笛卡尔乘积(但注意花括号并不是通配符)
- 中括号通配符如果用于表示字母的范围时,它中间使用的是横杠,比如
[A-Z],同是它是按照小写大写小写大写…的顺序来识别的;而花括号(注意花括号并不是通配符)用于表示字母的范围时,它中间使用的是两个点..(花括号用于扩展一直都是两个点),同是它则就是代表大写字母或者小写字母单一的,而不是混合的。注意自己使用时的用法
比如说[a-d],代表a,A,b,B,c,C,d的任意一个字符
而[A-d],则代表A,b,B,c,C,d的任意一个字符
- 因为中括号内只取一个 所以如果预定的字符类通配符注意外面再加一层括号(预定的字符类通配符看做是一个整体的字符即可),
21:57[root@centos7 /data]# touch f{1..10}.txt
21:58[root@centos7 /data]# ls
f10.txt f1.txt f2.txt f3.txt f4.txt f5.txt f6.txt f7.txt f8.txt f9.txt
21:58[root@centos7 /data]# ls f[167].txt
f1.txt f6.txt f7.txt
21:58[root@centos7 /data]# ls f[1-5].txt
f1.txt f2.txt f3.txt f4.txt f5.txt
21:59[root@centos7 /data]# ls f{1..10}.txt
f10.txt f1.txt f2.txt f3.txt f4.txt f5.txt f6.txt f7.txt f8.txt f9.txt
21:59[root@centos7 /data]# ls f[1-10].txt
f1.txt
21:59[root@centos7 /data]# ls f[1-9].txt
f1.txt f2.txt f3.txt f4.txt f5.txt f6.txt f7.txt f8.txt f9.txt
22:00[root@centos7 /data]# rm -f *
22:02[root@centos7 /data]# touch f{a..z}.txt
22:03[root@centos7 /data]# ls
fa.txt fd.txt fg.txt fj.txt fm.txt fp.txt fs.txt fv.txt fy.txt
fb.txt fe.txt fh.txt fk.txt fn.txt fq.txt ft.txt fw.txt fz.txt
fc.txt ff.txt fi.txt fl.txt fo.txt fr.txt fu.txt fx.txt
22:03[root@centos7 /data]# ls f[a-d].txt
fa.txt fb.txt fc.txt fd.txt
22:03[root@centos7 /data]# ls f[wagfg].txt
fa.txt ff.txt fg.txt fw.txt
22:03[root@centos7 /data]# ls f[^abcde].txt
ff.txt fh.txt fj.txt fl.txt fn.txt fp.txt fr.txt ft.txt fv.txt fx.txt fz.txt
fg.txt fi.txt fk.txt fm.txt fo.txt fq.txt fs.txt fu.txt fw.txt fy.txt
22:04[root@centos7 /data]# touch f{A..Z}.txt
22:05[root@centos7 /data]# ls
fa.txt fC.txt ff.txt fH.txt fk.txt fM.txt fp.txt fR.txt fu.txt fW.txt fz.txt
fA.txt fd.txt fF.txt fi.txt fK.txt fn.txt fP.txt fs.txt fU.txt fx.txt fZ.txt
fb.txt fD.txt fg.txt fI.txt fl.txt fN.txt fq.txt fS.txt fv.txt fX.txt
fB.txt fe.txt fG.txt fj.txt fL.txt fo.txt fQ.txt ft.txt fV.txt fy.txt
fc.txt fE.txt fh.txt fJ.txt fm.txt fO.txt fr.txt fT.txt fw.txt fY.txt
22:05[root@centos7 /data]# ls f[a-c].txt
fa.txt fA.txt fb.txt fB.txt fc.txt
22:05[root@centos7 /data]# ls f[A-C].txt
fA.txt fb.txt fB.txt fc.txt fC.txt
22:07[root@centos7 /data]# ls f[[:upper:]].txt
fA.txt fD.txt fG.txt fJ.txt fM.txt fP.txt fS.txt fV.txt fY.txt
fB.txt fE.txt fH.txt fK.txt fN.txt fQ.txt fT.txt fW.txt fZ.txt
fC.txt fF.txt fI.txt fL.txt fO.txt fR.txt fU.txt fX.txt
22:08[root@centos7 /data]# ls f[[:lower:]].txt
fa.txt fd.txt fg.txt fj.txt fm.txt fp.txt fs.txt fv.txt fy.txt
fb.txt fe.txt fh.txt fk.txt fn.txt fq.txt ft.txt fw.txt fz.txt
fc.txt ff.txt fi.txt fl.txt fo.txt fr.txt fu.txt fx.txt
11. 创建空文件和刷新时间—{touch}
- 格式:touch [OPTION]… FILE…
- -a 仅改变 atime和ctime
- -m 仅改变 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss]
指定atime和mtime的时间戳 - -c 如果文件不存在,则不予创建
12. 复制文件和目录—{cp,scp}
12.1. cp命令的用法
cp [OPTION]... [-T] SOURCE DESTcp [OPTION]... SOURCE... DIRECTORYcp [OPTION]... -t DIRECTORY SOURCE...
cp SRC DEST- SRC是文件:
- 如果目标不存在:
- 新建DEST,并将SRC中内容填充至DEST中
- 如果目标存在:
- 如果DEST是文件:将SRC中的内容覆盖至DEST中 基于安全,建议为cp命令使用-i选项
- 如果DEST是目录:在DEST下新建与原文件同名的文 件, 并将SRC中内容填充至新文件中
cp SRC... DEST- SRC… 多个文件
- DEST 必须存在,且为目录,其它情形均会出错
cp SRC DEST- SRC是目录:此时使用选项:-r
- 如果DEST不存在:则创建指定目录,复制SRC目录中所有文件至DEST中
- 如果DEST存在:
- 如果DEST是文件:报错
- 如果DEST是目录:在DEST下新建与原目录同名的目录,并将SRC中内容复制至新目录中
- SRC是目录:此时使用选项:-r
12.2. cp图示

12.3. cp常用选项
-i 覆盖前提示
-n 不覆盖,注意两者顺序
-r, -R 递归复制目录及内部的所有内容
-a 归档,相当于-dR --preserv=all
-d --no-dereference --preserv=links 当被复制的文件是软链接的时候,只复制软链接,不复制软链接指向的原文件,与-P几乎相同,看下面的解释
--preserv[=ATTR_LIST]
mode: 权限
ownership: 属主属组
timestamp: 时间戳
links :软链接目标
xattr :文件扩展属性(比较复杂,注意它并不是chattr的属性)
context :(SElinux安全)上下文
all :保留以上全部
-------------------------
-p 等同--preserv=mode,ownership,timestamp
-v --verbose 查看复制详细过程
-f --force
-u --update 只复制源比目标更新文件或目标不存在的文件
-b 目标存在,覆盖前先备份,形式为 filename~
--backup=numbered 目标存在,覆盖前先备份加数字后缀
---------------------------
比较复杂的:
-s 创造一个软连接而非拷贝
-l 创造一个硬链接而非拷贝
-P 拷贝的时候如果源文件是软链接文件,则只拷贝软连接文件到新文件中去
-L 拷贝的时候如果源文件是软链接文件,则直接拷贝它指向的文件本身并拷贝过来
---------------------------
详解见下方
12.4. cp的各种用法和注意点详解—{hexdump}
CP文件到当前目录,可以直接用.来表示当前目录
cp /etc/shadow .CP拷贝一个特殊类型的文件,比如字符文件,像
/dev/zero的时候,如果不加-a 选项(或者是–preserv=all),则会把这种字符文件中的内容给拷贝出来,如果中途也不停止的话,拷贝出来的文件占用空间也会越来越大。因此要用-a 选项保留源文件的各种属性。
# ll /dev/zero
crw-rw-rw- 1 root root 1, 5 Nov 18 15:18 /dev/zero
- 附加知识点1:这里显示的1,5而不是文件的大小;代表着此文件是一个设备文件,分为第1类的设备文件,其中此文件编号是5号;比如下面的硬盘文件进行举例:
# ll /dev/sd*
brw-rw---- 1 root disk 8, 0 Nov 18 15:18 /dev/sda
brw-rw---- 1 root disk 8, 1 Nov 18 15:18 /dev/sda1
brw-rw---- 1 root disk 8, 2 Nov 18 15:18 /dev/sda2
brw-rw---- 1 root disk 8, 3 Nov 18 15:18 /dev/sda3
brw-rw---- 1 root disk 8, 4 Nov 18 15:18 /dev/sda4
brw-rw---- 1 root disk 8, 5 Nov 18 15:18 /dev/sda5
brw-rw---- 1 root disk 8, 16 Nov 18 15:18 /dev/sdb
- 不加-a拷贝举例:
# cp /dev/zero . #等一会儿按一下Ctrl+c快捷键进行停止
# ll zero -h
-rw-r--r-- 1 root root 102M Nov 18 20:30 zero
可见拷贝过来的文件变成了普通文件并且大小在一直加大
- 附加知识点2: 并且拷贝过来的此文件(包括原文件也同样)不能用cat命令进行查看,因为它里面的所有位都是0,而ASCII编码表中的0代表着 NUL(\0)空字符,而NUL字符是一个非打印字符(前31位都是非打印字符),因此无法用cat命令查看到内容;更加详细的参考http://www.asciima.com/
- 附加知识点3:
- NUL的常用用法就是字符串结束符,C语言会源在每段字符窜后面自动加上这个,表示这个字符串结束了,比如
char * a = "hello world"; printf("%s",a)- 以字符串的格式输出,就表示以a为首地址的字符开始输出,当遇到字符串结束符 也就是NUL的时候就停止输出。
- 用hexdump命令进行查文件的二进制编码,如下:
# hexdump zero -C
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
06565000
- 更加详细的关于hexdump的操作参考https://www.linuxprobe.com/linux-hexdump.html
- 当拷贝文件夹的时候必须加上-r(-R)选项,但因为-a选项以及包含了-r选项,因此只用-a即可。
-P(--no-dereference)选项的意思是如果拷贝的文件是个软连接,则只拷贝软连接而不拷贝源文件- -d选项和-P几乎没区别,-d也就是多加了个保留软链接指向属性,但是-P选项本来也就可以保留软链接属性的,因此测试来看没有区别
- -P会导致如果原来的软链接指向路径是相对路径的话,拷贝之后因为源文件没有拷贝过来,则变成了空链
- 不过一般不单独使用-P选项,一般都是用-a进行备份的时候用到了-d,而-d和-P几乎没区别,此时的-a拷贝的一般都是文件夹,所以当所要拷贝的软链接文件和文件夹内的源文件都会被拷贝过来;
- 但有时候如果源文件并不在-a拷贝时的文件夹内的时候,此时就需要注意这个问题!!!
- 更加详细参考https://blog.csdn.net/nvd11/article/details/8749281
-L(--dereference)选项的意思是把这个软连接的源文件给拷贝过来。CP不加任何参数默认就是-L选项- -L 拷贝的时候如果源文件是软链接文件,则直接拷贝它指向的文件本身并拷贝过来,并把拷贝后的名称按照自己拷贝的设置修改为自己拷贝的文件名字
- 比如如果只拷贝一个文件的时候,自己如果指定了拷贝后的文件名字,则改为自己制定的文件名
- 而如果拷贝文件夹或者拷贝一个文件时直接拷贝到了文件夹内没有指定名字的话则就是改成了软链接文件的名字
- 其实改名就是按照拷贝的规则进行的,参考上面的CP命令的拷贝规则即可,这里只是再赘述一下
- 更加详细参考https://blog.csdn.net/nvd11/article/details/8749281
- -v 查看复制详细过程,通常和-a一起用组成-av选项
- -f 强制复制,有时候它看起来突破了文件权限进行文件的复制,但实际上并不是;它其实是把文件删除之后再进行复制这两个过程,而看起来突破了文件的权限实际上并没有,只是利用-f进行强制复制的用户对于目标文件夹拥有权限而已,对于所拥有权限文件夹内的文件的删除和被删除的文件本身的权限是没有关系的(文件夹权限和文件权限详细看权限一章节)
- -u是只有被复制的源文件比目标文件时间上更新或者目标文件缺失的时候才进行复制。注意它会覆盖掉目标文件,和下面要说的-b选项不同
- -b和–backup=numbered表示备份目标文件;也就是说即使选择覆盖,输入确认y,此时同样也备份目标文件
- 它俩区别就是前者不能加参数,多次覆盖的话也只保留覆盖前的最后一次备份;后者可以加参数,这里的numbered表示复制多次的话多次备份以前的文件。
13. 移动和重命名文件—{mv}
mv [OPTION]... [-T] SOURCE DESTmv [OPTION]... SOURCE... DIRECTORYmv [OPTION]... -t DIRECTORY SOURCE...- 常用选项:
- -i 交互式,如果目标存在则提醒是否覆盖,
- -f 非交互式,如果目标存在直接覆盖不提醒,注意这里的-f和cp的-f运行逻辑并不一样
- -b 目标存在,覆盖前先备份
- –backup=numbered 同理cp
- 常用选项:
13.0.1. 注意点4:
- mv可用于文件和文件夹改名
- mv移动文件夹不同于cp,不需要-r(-R)选项
- mv的-f选项与cp的运行逻辑并不相同
14. 删除—{rm}
rm [OPTION]... FILE...- 常用选项:
- -i 交互式,提醒是否删除(每次都提醒)
- -f 不提醒,直接删除;忽略不存在的文件和参数的报错信息,也从不提醒是否确认删除 ;慎用慎用!!
- -r,-R 递归删除,用于文件夹
- –no-preserve-root 可以删除根/
- 示例:
rm -rf /*
14.1. rm定义为别名mv防止生产中失误!
alias rm='mv --backup=numbered -t /recycle_bin/`date +%F`/'
14.2. rm的一些常用操作
- 删除以-开头的文件有两种方式
rm -- -foo 中间加两个-
rm ./-foo 利用相对路径或者绝对路径的办法
附加知识点:创建这样的特殊名称的文件也是利用绝对路径或者相对路径的方式进行创建的
- 判断rm命令将要删除的内容(一般可以这样,但不排除特殊情况不行)
- 利用
ls或者ll命令 - 也就是说,利用这两个命令查看其后面的文件或者文件夹(
ls ll查看文件夹的时候用-R,rm命令则-r -R都可),然后再用rm命令替换ls或者ll命令,则删除的就是之前利用ls和ll命令查看得到的内容 - 可以利用这个小技巧,在进行rm删除的时候避免误删除。
- 当然把rm换成mv命令的脚本以及回收站功能的脚本还是要写的。
- 特殊情况!!:不能用
ll 目录软链接/查看rm -rf 目录软链接/删除的内容; 因为这个rm命令,将会导致目录软链接本身 和 原始目录文件夹本身 都没有被删除,只是删除了;虽然rm命令删除的内容一般情况下和用ls ll命令查看到的内容是一致的,但这里就是特殊情况,记住即可) - 注意,一般情况下可以这样判断,但不排除其他特殊情况,比如各种
隐藏文件,.点 .*等等这些符号导致的问题,所以不能完全严格按照这个标准来测试,但是可以简单测试一下。 - 原理:其实不论是rm,mv,cp,还是ls,其后面的filename原则上都是利用parttern(也就是通配符匹配规则),所以可以用ls或ll查看文件用于检测,但是由于毕竟ls和cp,rm命令还是有区别的,所以不能完全严格用于检查。
- 利用
15. 目录操作—{tree,mkdir,rmdir,rm -r}
- tree 显示目录树
- -d: 只显示目录
- -L level:指定显示的层级数目
- -P pattern: 只显示由指定pattern匹配到的路径
- mkdir 创建目录
- -p: 存在于不报错,且可自动创建所需的各目录
- -v: 显示详细信息
- -m MODE: 创建目录时直接指定权限
- rmdir 只能删除空目录
- -p: 递归删除父空目录
- -v: 显示详细信息
- rm -r 递归删除目录树
16. 索引节点
- Linux里面的数据存储以一个分区为一个整体来存储数据
- Linux里面一块硬盘的一个分区在保存文件时,它的元数据和数据内容是分开保存的,其中元数据保存的地方在硬盘中叫inode(index node),索引节点
- 其中一个分区大约有1%的空间分配用来保存索引节点,如果索引节点的节点编号可用数量被用光,则即使仍有空余空间也无法再创建新文件
- 索引节点表:存放此分区上所有文件的索引节点的一个空间列表,其中列表中的每一项即对应着一个文件的索引节点,包含着这个文件的元数据
- inode 就相当于C语言中的结构体 它包含了与文件系统中各个文件相关的一些不同类型的重要信息
- 每一个索引节点都是一个表项,包含有关文件的信息(元数据):
- 文件类型,权限,UID,GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上其他文件的数据块指针
- 有关文件的其他数据
- 其中包含的有一个inode number,用于区分不同的文件
- 当文件引用时,会通过这个inode编号,找到其对应的inode,然后就可以在inode中找到此文件的所有元数据和数据存放位置(利用元数据中的指针)
- 人是通过文件名来引用一个文件,计算机内则找它对应的inode number,然后找到inode,最终找到所有信息
- 在目录中,目录下的文件名和文件inode号之间的映射表,组成了这个目录的内容
- 分清楚三个不同的概念:索引节点列表inode table》索引节点index node》索引节点编号inode number
- 索引节点内的节点编号仅用来区分不同文件,索引节点内的指针才能找到文件数据保存位置,索引节点编号具有唯一性,范围是在一个分区内
- 可以用 ll -i 来查看节点编号
- 可以用df -i (-h 更加易读的数据)查看剩余节点编号数量
- 更多详细介绍可以参考文章:
16.1. inode table(索引节点表)结构
可以参考文章 https://zhuanlan.zhihu.com/p/40604943


17. 目录文件(文件夹)
- 目录也是一个文件,只不过是目录文件而已
- 它也包含元数据,记录了各种信息,以及它的指针,指向它保存的数据
- 而目录文件数据块空间中保存的就是这个目录中的所有文件的名称对应文件的inode number构成的列表
- 由此可见文件名并不是元数据

18. cp和inode
在 CP的 命令:
- 分配一个空闲的inode number号,在inode table表中生成新条目
- 在文件夹目录中创建一个目录项(写在文件夹目录的数据块空间中),这个目录项就是被拷贝的文件的新名称和它刚刚被分配的inode编号的关联
- 拷贝数据生成新的文件
19. rm和inode
rm 命令:
- 被删除的文件对应的inode链接数递减(如果减为0,则从而释放的inode number号可以被重新使用)
- 假如删除的文件对应的inode链接数变成0的话,把此文件对应的数据块放在空闲列表free中;如果链接数不为0,则不作操作。
- 删除在文件夹中的目录项(文件名和它对应的节点编号)
19.0.1. 注意点5:
- 由此可见删除rm一个文件,只是把它所在文件夹目录中的一个记录项(文件名和inode number对应的记录)给删除了,并没有删除这个文件本身对应的数据块的内容。
- 数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖
- 带有链接的文件只有当链接数全部删除为0之后,才会释放这个inode条目(这个inode number节点编号就可以再次使用了)
20. mv和inode
- 如果mv命令的目标和源在相同的文件系统(linux中是在一个分区内,因为inode是按照分区划分的),作为mv命令
- 用新的文件名创建对应新的目录项(对应此文件的节点编号)
- 删除旧目录条目对应的旧的文件名和对应的这个文件的节点编号
- 不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!
- 如果目标和源在一个不同的文件系统,mv相当于cp和rm
20.0.1. 注意点6:
- 这其实也是在windows上面同一个分区(同一个文件系统)移动文件的速度极快,而跨分区移动文件很慢的原因。
21. 硬链接—{ln}
- 创建硬链接会在文件夹目录内创建额外的文件名及源文件相同的inode number对应的目录项,从而可以通过新创建的文件名引用源文件
- 对应于同一文件系统(一般是同一个分区)上一个物理文件
- 同一个硬链接的不同的目录表项(也就是文件夹内不同的文件名啦)引用相同的inode号
- 创建时inode链接数递增
- 删除一个硬链接文件时:
- rm命令递减此文件对应的inode内的链接数
- 文件要存在,至少有一个链接数
- 当链接数为零时,该文件被删除
- 删除硬链接文件只是删除了它所在的文件夹目录内的它所对应的一个记录项(这个被删除的硬链接文件名和inode number对应的记录)而已,并没有删除这个硬链接本身的inode指针对应的数据块内的数据;
- 语法:
ln filename [linkname ]
21.0.1. 注意点7:
- 不能用来备份,因为备份大多是物理层面,要存到其他地方
- 不能创建目录的硬链接,因为可能造成循环嵌套
- 不能跨越驱动器或分区(因为inode内的元数据包括和inode number等数据都不能改变,只能改变其中的链接数;跨分区文件系统当然不行)
- 虽然自己不能创建目录的硬链接,创建目录时,默认会生成两个目录项:
.和..。前者的inode号码就是当前目录的inode号码,等同于当前目录的硬链接;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的硬链接。所以,任何一个目录的硬链接总数,总是等于2加上它的子目录总数(含隐藏目录)
22. 软链接—{ln -s,readlink}
- 一个符号链接(软链接)指向另一个文件,它俩是不同的文件
- 一个符号链接的内容(也就是这个软链接文件内保存的数据)存储的是它引用的文件的路径,其大小为指向的文件的路径字符串的长度,和原始文件大小没有关系
- 不增加或减少目标文件inode的引用计数
- 软链接指向的目标文件如果删除,则会报红字错误,但如果重新创建一个和原文件名一样的文件,则软连接又重新指向它,即便它并不和原文件相同
- 语法:
ln -s filename .. [linkname]
readlink 可以查看软链接的原始文件的路径
ls -l 或 ll 显示链接的名称和引用的文件
22.1. 软链接的常用用法
- 软链接在生产中经常用来升级软件时的版本切换,不需要更改自己脚本中的代码
- 也可以用来把比较深的路径定义比较短的路径,类似别名的效果
- 还可以用来在更改了文件或者数据的路径之后,把老的文件夹目录指向新的文件目录,这样可以照顾旧程序中的引用目录直接到新目录中
22.2. 注意点8:
- 可以对目录进行软链接,也可以对文件进行软链接
- 假如是目录的软链接 用ll查看它的信息的时候不要加最后面的/,不然即使加上-d选项,它也仅仅是显示软链接的连接目标目录的信息(虽然名字是软链接目录的名字,要注意),而不会显示这个软链接文件本身的信息
- 同时注意目录的软链接:
rm -f 目录软链接或者rm -rf 目录软链接,后者虽然加了-r的递归, 但这两个命令都不会对原始文件造成影响,只是删除了这个目录软链接文件本身(因为没有加/的符号)- 但是
rm -rf 目录软链接/则对这个目录软链接本身和原始目录文件夹都没有影响 ,但却把目录文件夹下的内容全部删掉了(看起来很奇怪,为何源目录没有被删除,但事实就是如此,这一点是个特殊情况,这里就不能用ll 目录软链接/查看删除的内容了,因为目录软链接本身和目标目录文件本身都没有被删除,虽然rm命令删除的内容一般情况下和用ls ll命令查看到的内容是一致的,但这里就是特殊情况,记住即可)。 - 这一点尤其要注意, 加上
/和不加上/的区别
- 接3,但是如果是 “
rm -rf 目录或者rm -rf 目录/则效果相同,都是把目录本身以及它下面的所有文件和目录都删除掉了,这个就没有什么特别的了,就是rm的命令功能;更详细的rm 删除目录的区别详见 rm指令下 - 如果是文件的软链接,则
rm -f 文件软链接则删除掉这个软链接文件 对原始文件也没有影响。 - 软链接特征的注意点:
- 注意:可以跨分区
- 注意:软链接还可以再对软链接进行链接
- 注意:当创建软链接使用相对路径的时候,相对的是要创建的这个软链接它本身的存放位置的路径,而不是当前工作目录的路径,不然会红字错误。
- 创建软链接尽量多使用相对路径(系统创建时用的就是相对路径),这样对于之后程序的更新等等更加方便
- 附加知识点:.. 代表父目录 ../ 代表父目录下的 ../../ 代表父目录的父目录下的 可以一直加.. 并没有语法错误。 因为用ls -a查看文件夹下的所有文件时就有.. 和 . 所以..可一直嵌套下去
# ll /data/slinktest
lrwxrwxrwx. 1 root root 16 Mar 10 18:21 /data/slinktest -> /data/textdir1/x
# ll /data/slinktest/
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b
# ll /data/slinktest/ -d
drwxr-xr-x. 4 root root 24 Mar 10 11:07 /data/slinktest/
# ll /data/slinktest -i -d /data/textdir1/x
123 lrwxrwxrwx. 1 root root 16 Mar 10 18:21 /data/slinktest -> /data/textdir1/x
33555680 drwxr-xr-x. 4 root root 24 Mar 10 11:07 /data/textdir1/x
# ll /data/slinktest/ /data/textdir1/x/
/data/slinktest/:
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b
/data/textdir1/x/:
total 0
drwxr-xr-x. 2 root root 6 Mar 10 11:07 a
drwxr-xr-x. 2 root root 6 Mar 10 11:07 b
23. 软硬链接的区别总结:
- 本质: 硬链接:一个文件多个名字,硬链接是相同的文件 软链接:一个文件的快捷方式,和源文件是不同的文件
- 链接数:inode元数据中链接数只有创建硬链接时候增长,软链接不会增长
- 跨分区:硬链接不支持,软连接支持
- 目录文件:硬连接不可以链接目录文件,软连接可以
- 原始文件和链接文件的关系: 硬链接是独立平等的关系,删除不影响其他的硬链接(相当于删除了一个文件名) 软连接依赖于原始文件,删除原始文件则软链接报错
- 大小:硬链接都是同一个文件,大小相同;软链接的大小取决于它指向的原始文件的路径的字符数量
24. 确定文件内容—{file}
- linux中文件类型不看后缀, 即使修改后缀也对原文件没有影响,比如修改 cat 为 cat.txt 仍然可以使用
- 文件可以包含多种类型的数据
- 检查文件的类型,然后确定适当的打开命令或应用程序使用
file [options] <filename>...
常用选项:
-b 列出文件类型的辨识结果时,不显示文件名称了,直接显示文件类型
-f filelist 列出文件filelist中文件名的文件类型,其中filelist的每一行列出一个文件名(的路径)
-F 使用指定分隔符号替换输出文件名后默认的”:” 分隔符
-L 查看对应软链接对应文件的文件类型
--help 显示命令在线帮助
留言