【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变量;可以看当前用户名、主机名、工作目录等)

一、文件目录绝对路径和相对路径  

①、绝对路径:  

我们知道了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)  

上面其实已经使用了这个命令,意为查看当前工作目录所处的绝对路径位置

!—如果要查看执行当前目录文件或目录,大可直接输入,并可补全–!

[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

二、文件和目录的相关管理操作  

①、创建文件和目录: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  

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  

[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  

该命令是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  

改命令是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(也可重命名)  

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  

这个厉害了,在工作中,博主经常使用它;没错,我们知道linux服务器是跑业务的,而我们平日的工作显然不能一直在这上面,我们需要自己的个人电脑或办公电脑,而它一般仍然是windows系统的,不要和我扯苹果了!

那么我们经常会拿linux里面的文件出来,在windows下编辑,比如脚本,那么如果我们使用专业的工具,如notepad++ 或uditor或许没啥事;一旦使用win的编辑工具如记事本打开编辑并保存,其文件格式将自动转变为windows的dos格式;这样再放到linux系统中,如果是可执行文件,则执行不了的哦,所以我们需要这么一个工具来转换格式;

dos2unix:把文件格式从dos转换为unix格式;直接dos2unix filename就行,多个文件用空格隔开

当然如果是windows下使用notpad++或uditor工具编辑时,每次保存可以检查一下器编码格式有无改变,如果变了,可以直接转换为unix;

三、文件的时间戳应用;  

之前我们说,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时间戳  

在很多程序中,引用的时间显然不是正常的时间格式,而是一种叫做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

Edit@bigmouth【原创博文】®【系统工程】


原创文章,转载请注明:转自于公牛博客

本文链接地址:【linux系统命令②】、文件目录的管理

4
祝福我们的祖国繁荣昌盛
  • 请尽情挥洒您的笔墨!

    非常感谢作者的分享,这篇文章让我受益匪浅。作者的语言表达非常清晰流畅,让我能够轻松理解文章的内容。我非常喜欢这篇文章,因为它让我学到了很多知识。我期待着作者的下一篇文章,希望能够继续从中受益。 /加油 /喜欢 /阳光

    2023-06-21 03:00回复

    送你千万幅春景,春景艳艳美心间。送你美丽的春天,春天洒满友谊篇!

    2017-06-03 09:10回复

    欢迎来到公牛博客更多分享更多精彩记录美丽点亮生活

    公牛博客·统计碑运行:2857 D
    博文:213 P
    评论:1872 S