[---TOC---][---TOC Header:【系统工程】linux系统命令②-文件目录的管理---]
(由于以下内容纯经手打,有些过于白话,且省事尽量无配图,不明之处敬请留言!)
简介:
linux操作系统就是由大大小小的目录和文件组成,事实上几乎所有的计算机操作系统,都是使用这种树状目录结构来组织文件;
linux更彻底,系统所有文件、目录都放在根目录下,目录名为“/”;
而linux根据FHS(文件系统层次标准),对根目录下默认的主要目录又定义并赋予了各自主要的功能;
[root@Moni ~]# cd / [root@Moni /]# ls bin cgroup dev home lib64 media mnt opt root selinux sys usr boot db etc lib lost+found misc net proc sbin srv tmp var
下面给大家列举一下FHS给予目录的用途定义:
目录 | 用途 |
---|---|
/bin | 常见的用户文件指令,cat、awk、copy、ls、mount、touch、mkdir |
/boot | 内核和启动文件 |
/dev | 设备文件 |
/etc | 系统和服务的配置文件 |
/home | 系统默认普通用户家目录 |
/lib | 系统函数库目录 |
/lost+found | ext3文件系统需要的目录,用于磁盘检查 |
/mnt | 常用的挂载点,如挂载光盘、U盘、其他文件系统 |
/opt | 第三方软件安装目录 |
/proc | 虚拟文件系统,也就是最小系统目录,可以查看一些硬件、内核、进程等运行状态 |
/root | root用户的家目录 |
/sbin | 存放系统管理命令 |
/tmp | 临时文件的存放目录 |
/usr | 存放于用户直接相关的文件和目录 |
/media | 系统常用来挂载驱动光盘等临时文件系统,雷同/mnt,就是个挂载点; |
(而linux命令行最前面的注释内容为$PS1变量;可以看当前用户名、主机名、工作目录等)
一、文件目录绝对路径和相对路径[---TOC Heading:一、文件目录绝对路径和相对路径---]
①、绝对路径:[---TOC Heading:①、绝对路径:& ②、相对路径---]
我们知道了linux系统采用了目录树的文件组织结构,在linux下每个目录或文件都是以根目录开始的,如“/home/oxblog1/123.txt”;
是的像这种从根目录开始展示所有路径的,我们称之为绝对路径;以“/”开头的;
"/"符号代表“目录”的意思;
②、相对路径:
依然,如此展示文件目录路径,当路径比较纵深的话,当我们调用时那是很麻烦的事情;
所以linux给出了相对路径,意为目标目录或文件,相对于当前工作目录是什么位置,没错,没明白的可以研究一下相对论;
如:当前我从/root根目录下面切换到/home/oxblog1目录下:cd /home/oxblog1
这时,我们要读取123.txt文件,或是查看系统根目录下面的456.txt文件:
[root@Moni oxblog1]# echo ------123------ >123.txt [root@Moni oxblog1]# echo ------456------ >/456.txt [root@Moni oxblog1]# cat 123.txt && cat ./123.txt ------123------ ------123------ [root@Moni oxblog1]# cat ../../456.txt && pwd ------456------ /home/oxblog1 [root@Moni oxblog1]# cat ../../../../456.txt && pwd ------456------ /home/oxblog1
看到这里可能,有些道友不明白的,我是说初学的童鞋,不要介意,我们现在只需要理解相对路径就行;
没错我先创建两个文件,然后使用“&&”符号同时执行两次查看;
如第三条,可以看到前后两次都正确显示了123.txt文件中的内容,区别在于,前者我是直接输入文件名称,后者却在文件名前加上了“./”;
而第四条,我通过在文件名前加了“../../”连续两个“../”从而正常查看了位于"/456.txt"文件中的内容,后面我又紧跟和查看了当前的工作目录是/home/oxblog1/;
是的,"/456.txt"相对于"/home/oxblog1",我们可以理解456.txt是在根目录下,同时也相对于在/home/oxblog1目录的上级的上级目录下;
从而得出结论:相对路径中以“.”代表当前目录;以“..”代表上级目录;如果多个上级就是多个“../”相加;
但大家注意我最后一条命令,456.txt前我加了四个“../”,并依然是在/home/oxblog1/目录下工作,但任然正常查看了/456.txt文件中的内容;
没错,当我们使用相对路径是,最顶级不能超过根目录,如果超过,则多出来的符号是无效的;
③、当前目录:(pwd)[---TOC Heading:③、当前目录:& ④、特殊目录---]
上面其实已经使用了这个命令,意为查看当前工作目录所处的绝对路径位置;
!---如果要查看执行当前目录文件或目录,大可直接输入,并可补全--!
[root@Moni oxblog1]# ll drwxr-xr-x 2 root root 4096 5月 25 15:21 123 -rw-r--r-- 1 root root 16 5月 25 14:52 123.txt [root@Moni oxblog1]# echo ------789------>123/789.txt [root@Moni oxblog1]# cat 123.txt && cat 123/789.txt ------123------ ------789------ [root@Moni oxblog1]# cat ./123/789.txt ----789----
可以看到当前目录下面有一个文件123.txt和一个目录123,区分目录和文件我们下面会讲到;
然后查看了当前目录下的123.txt,便可以直接cat 123.txt;
而紧接着我查看了123目录下的789.txt文件,则是直接cat 123/789.txt,或是最后一条cat ./123/789.txt
所以,当前目录下的下一级目录123,我们可以表示为,“123/”或“./123/”
④、特殊目录:(.)和(..)
上面也说了,分别代表当前目录和上层目录;用于相对路径;
有的童鞋说了,为啥不说这个,上面说了那么多诠释,事实上,linux每个命令每个关键字符,都是有逻辑有设定的,而不是平白来的符号;
[root@Moni oxblog1]# ls -al drwx------ 5 oxblog1 oxblog1 4096 5月 25 15:21 . drwxr-xr-x. 7 root root 4096 5月 24 14:00 ..
看到没有,其实在每个目录下面都有两个隐藏目录:“.”和“..”;
所以结合上面的当前目录,应该能够理解它的原理:
[root@Moni oxblog1]# cd . && pwd /home/oxblog1 [root@Moni oxblog1]# cd .. && pwd /home
二、文件和目录的相关管理操作[---TOC Heading:二、文件和目录的相关管理操作---]
①、创建文件和目录:touch、mkdir[---TOC Heading:①、创建文件和目录:touch、mkdir---]
!--touch创建文件、mkdir创建目录--!
[root@Moni oxblog1]# ls 123.txt [root@Moni oxblog1]# touch 111.txt && ls 111.txt 123.txt [root@Moni oxblog1]# mkdir 123 && ls 111.txt 123.txt 123
那么如果我touch了一个已经存在的文件呢?事实上它只会修改文件的时间属性,而不改变其内容;
[root@Moni oxblog1]# ll && touch 123.txt && ll -rw-r--r-- 1 root root 16 5月 25 15:41 123.txt -rw-r--r-- 1 root root 16 5月 25 15:43 123.txt
如果是mkdir创建目录,有重复名称的呢?
[root@Moni oxblog1]# mkdir 123 mkdir: 无法创建目录"123": 文件已存在
此外上面创建目录和文件都是在当前目录下,当然也可以在相对和绝对路径下创建;
而如果我们创建的目录文件时,有一个目录不存在,无法创建怎么办?
[root@Moni oxblog1]# mkdir 456/789/123 mkdir: 无法创建目录"456/789/123": 没有那个文件或目录 [root@Moni oxblog1]# mkdir -p 456/789/123 && du -l 456 | head -n1 4 456/789/123
可以看到,mkdir命令参数“-p” 可以创建同时多级目录;
②、删除文件和目录:rm、rmdir[---TOC Heading:②、删除文件和目录:rm、rmdir---]
rm命令是remove的缩写,不难理解就是移除,文件目录都能移除:
rmdir命令是remove directory的缩写,直译即删除目录;
[root@Moni oxblog1]# ls && rm 123.txt && ls && rm 123 111.txt 123 123.txt 456 rm:是否删除普通文件 "123.txt"?y 111.txt 123 456 rm: 无法删除"123": 是一个目录 [root@Moni oxblog1]# rm -r 123 && ls rm:是否删除目录 "123"?y 111.txt 456 [root@Moni oxblog1]# du -l 456 | head -n1 && rmdir 456/789/ 4 456/789/123 rmdir: 删除 "456/789/" 失败: 目录非空 [root@Moni oxblog1]# rmdir 456/789/123/ && rmdir 456/789/ && du -l 456 4 456
首先我们可以看到当前目录下有两个文件123.txt、111.txt和一个目录123;
我先“rm 123.txt”直接删除了123.txt文件,并查看已经删除成功;
紧接着我继续“rm 123”准备直接删除123目录,但是提示无法删除;
于是我只好执行了“rm -r 123”删除了这个目录,并查看删除成功;
没错,直接执行rm +filename 可删除文件、rm -r +directoryname方可删除文件;
细心的童鞋会注意到,每次删除时系统会安全提示,是否删除?“y”表示“是的”,“n”表示“不”;
此外,rm命令参数“-f”,意为强制删除;删除需谨慎啊!
最后我们使用rmdir删除目录,当前目录下有456/789/213三级子目录,但不难发现,rmdir只能删除空目录;
如果目录有子目录或文件,则需手动删除所有子目录和文件,才能删除目录;
所以不实用,一般我们都使用“rm -r”来删除目录;
③、移动和重命名目录和文件:mv[---TOC Heading:③、移动和重命名目录和文件:mv---]
[root@Moni oxblog1]# ls !--操作前 123.txt 456
!--把文件123.txt重命名为234.txt--!
[root@Moni oxblog1]# mv 123.txt 234.txt
!--把文件234.txt移动到456目录下并重命名为123.txt--!
[root@Moni oxblog1]# mv 234.txt 456/123.txt
!--把文件456目录下123.txt移动到当前目录--!
[root@Moni oxblog1]# mv 456/123.txt ./
!--把目录456移动到/home目录下并重命名为789--!
[root@Moni oxblog1]# mv 456 /home/789
!--把/home/789目录移动到当前目录--!
[root@Moni oxblog1]# mv /home/789/ ./
[root@Moni oxblog1]# ls !--操作后结果 123.txt 789
④、切换目录:cd[---TOC Heading:④、切换目录:cd---]
该命令是change directory的简写;方便用户切换到不同的目录;
!--查看当前工作目录--! [root@Moni ~]# pwd /root !--切换到/home/oxblog1目录--! [root@Moni ~]# cd /home/oxblog1 !--切换到上一层目录--! [root@Moni oxblog1]#cd ../ !--切换到上次的工作目录--! [root@Moni home]# cd - /home/oxblog1 [root@Moni oxblog1]#
其中"cd -"切换到上一次的工作目录经常使用!
如上我从/root宿主目录下,先切换到/home/oxblog1目录,在切换到其的上层目录/home/下,最后直接退回到上次的工作目录/home/oxblog1/目录下!
⑤、查看文件:cat[---TOC Heading:⑤、查看文件:cat、head、tail、more---]
改命令是concatenate的简写,可查看文件内容:
[root@Moni oxblog1]# echo ----1---- >123.txt && cat 123.txt ----1---- [root@Moni oxblog1]# echo ----2---- >>123.txt && cat -n 123.txt 1 ----1---- 2 ----2----
cat + filename 可直接查看文件内容,而参数“-n”则显示每行的行号;
注意:如果文件内容过长,在字符界面,就会直接在眼前一闪而过,只显示最后的内容,由终端屏幕的高度决定;
所以,另一个查看文件more,意为更多即分页显示;
如下,我把终端缩小到只能显示三行,如果直接cat,则只显示最后三行;
而如果用more命令则可以从头显示,切“空格”为翻页、“回车”则向下翻一行;
[root@Moni oxblog1]# cat 123.txt ----3---- ----4---- ----5---- [root@Moni oxblog1]#more 123.txt [root@Moni oxblog1]# more 123.txt ----1---- ----2---- ----3---- --More--(58%)
而more不仅仅是查看文件,更可以分页显示其他命令输出!我们也已这样!
[root@Moni oxblog1]# cat 123.txt | more ----1---- ----2---- ----3---- --More--(58%) !--如果文档没看完,可以Ctrl+C或q键退出--!
(其中“|”符号为命令管道符,意为把上条命令输出交给下级命令处理)
⑥、查看文件头命令:head
文件内容过长怎么办,使用more也是从上往下翻,而我们也只想看看文章的开始部分怎么办:
head命令,只查看文件开始部分内容;
[root@Moni oxblog1]# head -n2 123.txt ----1---- ----2----
“-n”参数可指定显示多少行,从文件头部开始显示,默认不加此参数是10行;
⑦、查看文件尾命令:tail
如上,如果我们想只看文件最后的内容怎么办?
tail命令,只查看文件尾部内容;
[root@Moni oxblog1]# tail -n2 123.txt ----4---- ----5----
“-n”参数雷同head,只是其是从文件最后开始显示,默认不加此参数是10行;
此外,tail 的另一个参数 “-f” 意为可动态的查看文件尾部多少行的内容;
问,为什么head没有-f,tail有,我们知道文件新增内容一般是从底部开始增加,所以文件开始位置一般是不会改变的;
而文件的结尾就不一样了,随着文件数据的不断增加,文件的最后内容是不停改变的,故tail -f最重要的就是对日志文件的查看!
扩展:如何查看文件指定位置的内容?
虽然我们可以查文件开始,文件结尾,但是常常,我们更需查看中间某段内容;
如查看文件第三行到第四行的内容:
[root@Moni oxblog1]# head -n4 123.txt | tail -n2 ----3---- ----4----
!--即我们需要head和tail相结合的使用,来截取某段内容--!
⑧、文件和目录的复制:cp(也可重命名)[---TOC Heading:⑦、文件和目录的复制:cp---]
cp和rm命令类似,当我们cp文件是,直接cp+filename就行;
当我们cp目录是,需要加上“-r”的参数;
!--拷贝123.txt到456目录下--!
[root@Moni oxblog1]# cp 123.txt 456/
!--拷贝123.txt到234.txt(重命名)--!
[root@Moni oxblog1]# cp 123.txt 234.txt
!--拷贝目录到456成789--!
[root@Moni oxblog1]# cp 456 789 cp: 略过目录"456" [root@Moni oxblog1]# cp -r -f -p 456 789
特别注意:
cp目录时,如果目标目录不存在,则为拷贝整个目录后重命名目录;
如果目录存在,则源目录会成为目标目录的子目录;
cp文件时,如果目标不存在,拷贝后重命名,如果存在则问你是否覆盖,“y”确认则覆盖;
其中,“-f”为强制拷贝、“-p”则保留源文件或目录属性、“-R”则表示目录下的所有子文件和子目录递归处理;
⑨、文件格式的转换:dos2unix[---TOC Heading:⑧、文件格式的转换:dos2unix---]
这个厉害了,在工作中,博主经常使用它;没错,我们知道linux服务器是跑业务的,而我们平日的工作显然不能一直在这上面,我们需要自己的个人电脑或办公电脑,而它一般仍然是windows系统的,不要和我扯苹果了!
那么我们经常会拿linux里面的文件出来,在windows下编辑,比如脚本,那么如果我们使用专业的工具,如notepad++ 或uditor或许没啥事;一旦使用win的编辑工具如记事本打开编辑并保存,其文件格式将自动转变为windows的dos格式;这样再放到linux系统中,如果是可执行文件,则执行不了的哦,所以我们需要这么一个工具来转换格式;
dos2unix:把文件格式从dos转换为unix格式;直接dos2unix filename就行,多个文件用空格隔开;
当然如果是windows下使用notpad++或uditor工具编辑时,每次保存可以检查一下器编码格式有无改变,如果变了,可以直接转换为unix;
三、文件的时间戳应用;[---TOC Heading:三、文件的时间戳应用;---]
之前我们说,touch一个已经存在的文件,其文件内容属性都不变只会更新其创建时间;
而mkdir一个已经已经存在的目录是被拒绝的;事实上,touch同样可以touch一个已经存在的目录;效果是和touch文件一样的;
[root@Moni oxblog2]# mkdir directory1 && touch file1 && ll drwxr-xr-x 2 root root 4096 5月 25 18:58 directory1 -rw-r--r-- 1 root root 0 5月 25 18:58 file1 !--过了三分钟后--! [root@Moni oxblog2]# touch directory1 && touch file1 && ll drwxr-xr-x 2 root root 4096 5月 25 19:01 directory1 -rw-r--r-- 1 root root 0 5月 25 19:01 file1
其实,不管哪种系统,我们知道都是一个个文件和目录组成,那么任何程序都会产生文件的读写操作,而只要文件发生了写的操作,文件的时间戳就会发生改变;
如此我们便可以利用这个原理来进行文件的差异备份咯;当然这只是简单的备份;
如我们把/db目录下面的所有文件第一次先全部备份,然后在几天之后,查看这个目录下的所有文件时间戳,和备份目录的文件时间戳对比;
如果是新文件,或是时间戳比备份目录对应的文件新,那么就备份这个文件覆盖第一次备份的文件;
而其他时间戳没有改变的文件则不需要备份;
当然这个操作显示不能人工来完成,工作中一般都是脚本的自动化运维,后期有机会可以交流;
扩展:unix时间戳[---TOC Heading:扩展:unix时间戳---]
在很多程序中,引用的时间显然不是正常的时间格式,而是一种叫做unix时间戳的格式;
unix时间戳?它是以一种定义为从格林威治时间1970年01月01日00时00分00秒起至现在的总秒数的时间表示方式,被广泛应用在unix、类unix和其他一些操作系统中;
!--linux、unix获取unix时间戳命令--!
[root@Moni oxblog2]# date +%s 1495711536
!--linux把unix时间戳转换为正常时间格式--!
[root@Moni oxblog2]# date -d @1495711536 2017年 05月 25日 星期四 19:25:36 CST
!--linux、unix把正常时间格式转换为unix时间戳--!
[root@Moni oxblog2]# date -R Thu, 25 May 2017 19:25:06 +0800 [root@Moni oxblog2]# date +%s -d"May 25 2017 19:25:06" 1495711506
当然也可以在找些网上的在线转换网页哦!
(今天就到这里了,有疑问的地方欢迎大家留言哦。)
看了本篇文章的还道友还要看:linux系统命令和shell
非常感谢作者的分享,这篇文章让我受益匪浅。作者的语言表达非常清晰流畅,让我能够轻松理解文章的内容。我非常喜欢这篇文章,因为它让我学到了很多知识。我期待着作者的下一篇文章,希望能够继续从中受益。
送你千万幅春景,春景艳艳美心间。送你美丽的春天,春天洒满友谊篇!
很荣幸来到这里参观!