Linux 基本shell命令和Linux rm -rf原理分析
还是老规矩,循序渐进,先来简单入门一下Linux
Linux中一切皆文件,所以我们应该知道的是Linux中只有一个根目录,然后分为下图几个目录,其中桌面在home 目录下,图(来源网上):
cd
> cd 目的地 --(..代表父目录,.代表当前目录)
一开始打开的终端仿真器是默认在桌面目录下打开的,即$前面有个~号。
pwd
> pwd --显示当前路径
ls
> ls --显示当前目录下的文件(夹)
-R
> 递归的作用 --配合使用
-i
> 询问信息 --配合使用
touch
创建空文件
mkdir
创建空目录
cp
> cp 源文件 目的文件 ----复制源文件
mv
> mv 源文件 目的文件 ---移动,源文件消失
rm/rmdir
rm 删除源文件 / rmdir 删除空目录
file
> file 源文件 ---查看文件类型
cat
cat 源文件 –查看文件内容
cat 源文件 -n 带行号(包括空行)显示
cat 源文件 -b 带行号显示(只包括文本)
cat 源文件 -T 不让制表符(用^I代替)出现
more/less
> more/less 源文件 --查看大文件,以页的方式查看
tail/head
> tail/head 源文件 -n --查看大文件内容的尾部和头部n行
tree
一种展示目录的美观工具,sudo apt install tree可安装
rm -rf
rm -rf -i 源目录 (r是递归删除,f是强制删除,i是提示信息)
递归删除是不是很神奇,这倒是让我产生了浓厚的兴趣,遂进行了一番研究,以下内容参考自:Linux rm删除文件原理
*文件系统的链接
硬链接(无法给目录添加)
符号链接(可以给目录添加)
只能够在处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
文件 或目录的inode编号是一个用于标识的唯一数字,这个数字由内核分配给文件系统中的每一个对象,要想查看文件或目录的inode编号,可以给ls命令加入-i参数
很多时候,我们都会发现,某个进程在对当前文件读写,但是我们依然能够rm, 是不是很奇怪?而windows下面,肯定会报错,”当前文件正在被使用“, 这就得从linux下面删除文件的原理说起了。
Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。
i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。
当一个文件被某一个进程引用时,对应i_count数就会增加;当创建文件的硬链接的时候,对应i_nlink数就会增加。
对于删除命令rm而言,实际就是减少磁盘引用计数i_nlink。这里就会有一个问题,如果一个文件正在被某个进程调用,而用户却执行rm操作把文件删除了,那么会出现什么结果呢?当用户执行rm操作删除文件后,再执行ls或者其他文件管理命令,无法再找到这个文件了,但是调用这个删除的文件的进程却在继续正常执行,依然能够从文件中正确的读取及写入内容。这又是为什么呢?
这是因为rm操作只是将文件的i_nlink减少了,如果没其它的链接i_nlink就为0了;但由于该文件依然被进程引用,因此,此时文件对应的i_count并不为0,所以即使执行rm操作,但系统并没有真正删除这个文件,当只有i_nlink及i_count都为0的时候,这个文件才会真正被删除。也就是说,还需要解除该进程的对该文件的调用才行。
以上讲的i_nlink及i_count是文件删除的真实条件,但是当文件没有被调用时,执行了rm操作删除文件后是否还可以找回被删的文件呢?
前面说了,rm操作只是将文件的i_nlink减少了,或者说置0了,实际就是将文件名到inode的链接删除了,此时,并没有删除文件的实体即(block数据块),此时,如果及时停止机器工作,数据是可以找回的,如果此时继续写入数据,那么当新数据就可能会被分配到被删除的数据的block数据块,此时,文件就会被真正的回收了
备注:根据以上原理,实际情况会出现以下问题,web服务器磁盘空间不够了,删除了所有无用日志还是显示磁盘空间不足,但是用du -sh /*发现磁盘空间占用的远小于硬盘总大小,这就是因为只删除了一个i_nlink,而还有其他进程在使用着这些log文件,apache或者tomcat,重启再看就ok了。
补充:
df命令详细用法
a:显示全部的档案系统和各分割区的磁盘使用情形
i:显示i -nodes的使用量
k:大小用k来表示 (默认值)
t:显示某一个档案系统的所有分割区磁盘使用量
x:显示不是某一个档案系统的所有分割区磁盘使用量
T:显示每个分割区所属的档案系统名称
h:动态显示易读的格式
常用命令:df -hi
du:查询档案或目录的磁盘使用空间
a:显示全部目录和其次目录下的每个档案所占的磁盘空间
b:大小用bytes来表示 (默认值为k bytes)
c:最后再加上总计 (默认值)
s:只显示各档案大小的总合 (summarize)
x:只计算同属同一个档案系统的档案
L:计算所有的档案大小
常用命令:du -a
系统管理命令:
start:显示指定文件的相关信息,比ls命令显示的内容更多
who,w:显示在线登录用户
whoname :显示用户自己的身份
hostname:显示主机名称
uname:显示系统信息
top:显示当前耗费资源最多的进程
ps:显示瞬间进程状态
du:显示文件已使用磁盘空间的总量
free:显示当前内存和交换空间的使用情况
ifconfig:显示网络接口信息
ping:测试网络的连通性
man:命令帮助信息查询
Alias:设置命令别名
alias[别名]=[“指令名”]
Clear:清屏
Kill:杀死进程
dpkg和apt get的区别:
两者的区别是dpkg绕过apt包管理数据库对软件包进行操作,所以你用dpkg安装过的软件包用apt可以再安装一遍,系统不知道之前安装过了,将会覆盖之前dpkg的安装。
1、dpkg是用来安装.deb文件,但不会解决模块的依赖关系,且不会关心ubuntu的软件仓库内的软件,可以用于安装本地的deb文件。
2、apt会解决和安装模块的依赖问题,并会咨询软件仓库, 但不会安装本地的deb文件, apt是建立在dpkg之上的软件管理工具。
dpkg软件管理工具:(基于Debian)
dpkg –info “软件包名” –列出软件包解包后的包名称.
dpkg -l –列出当前系统中所有的包.可以和参数less一起使用在分屏查看.
dpkg -l |grep -i “软件包名” –查看系统中与”软件包名”相关联的包.
dpkg -s 查询已安装的包的详细信息.
dpkg -L 查询系统中已安装的软件包所安装的位置.
dpkg -S 查询系统中某个文件属于哪个软件包.
dpkg -I 查询deb包的详细信息,在一个软件包下载到本地之后看看用不用安装(看一下呗).
dpkg -i 手动安装软件包(这个命令并不能解决软件包之前的依赖性问题),如果在安装某一个软件包的时候遇到了软件依赖的问题,可以用apt-get -f install在解决信赖性这个问题.
dpkg -r 卸载软件包.不是完全的卸载,它的配置文件还存在.
dpkg -P 全部卸载(但是还是不能解决软件包的依赖性的问题)
dpkg -reconfigure 重新配置
apt高级包管理工具
软件源设置 /etc/apt/sources.list
更新软件源数据 apt-get update
更新已安装软件 apt-get upgrade
更新系统版本 apt-get dist-upgrade
通过安装包或卸载包来修复依赖错误 apt-get -f install
搜索软件源数据 apt-cache search foo
解压安装软件包 apt-get install foo
重新安装软件包 apt-get –reinstall install foo
删除软件包释放的内容 apt-get remove foo
卸载软件,同时清除该软件配置文件 apt-get –purge remove foo
删除不需要的包 apt-get autoclean
删除所有已下载的包 apt-get clean
在用命令apt-get install之前,是先将软件包下载到/var/cache/apt/archives中,之后再进行安装的.所以我们可以用apt-get clean清除/var/cache/apt/archives目录中的软件包.
源码包安装
自动安装编译一软件所需要的包 apt-get build-dep foo
再次梳理一下:
文件目录操作指令:
ls:显示文件和目录列表
mv:移动文件或目录,文件或重名
-l:列出文件的详细信息
- find:查找指定的文件
-a:列出当前目录的所有文件,包含隐藏文件
-name:文件名
mkdir:创建目录
wc:统计文本文档的行,字,字数
-p:父目录不存在的情况下先生成父目录
grep:查找指定字符
cd:切换目录
rmdir:删除空目录
touch:生成一个空文件
tree:显示目录,目录改名为树
echo:生成一个带内容的文件
pwd:显示当前的工作目录
cat,tac:显示文本文件的内容
ln:建立链接文件
cp:复制文件或目录
more,less:分页显示文本文件内容
rm:删除文件
Head,tail:显示文件开头和结尾内容
-r:同时删除该目录下的所有文件
-f:强制删除文件或目录
小结
总体来说,这篇博文的产生是来源于tree和rm -rf -i的操作引起的,因为看见了删除过程中的递归删除,先进行递到末目录,然后归来删除。再接再厉吧,感觉Linux还是挺有意思的。