接上文。
想要了解一个人,就先要了解他的灵魂。可是别说是灵魂了,就连一个真心的笑容,你在生活中也很难见到。更多的是菩萨手段,修罗心肠。很多人喜欢孩子的原因,就是因为他们悲喜表于面,空白藏与心,与你进行的是灵魂的交流。
所以妹子抽出手的时候,小王虽然略感失望,但还没有到影响心情的地步。这个可能是真的拒绝,也可能是欲说还休,处在朦胧状态,也别有一番滋味。妹子已经不是孩子了,不可能直达灵魂,他也只能按部就班,先了解一下对方基本喜好,行为举止。
至于接下来,管它呢。有的人心扉一戳就开,有的却把真实的一面直接带进坟墓。到底碰见的是哪一种,全凭运气。
小王就是这么认为。
幸运的是,要想了解Linux的文件操作,可以直接了解它的灵魂。
想要了解linux的基本使用方法,就要了解一个基本的事实—linux系统中,一切皆文件。
不管是命令,还是文档,甚至设备,目录,套接字,在linux上对它们的操作都是一致对待的。许多开发驱动程序的小伙伴,会发现使用的一些函数,和读写文件的没什么两样(open、close、read、write、ioctl)。今天我们所说的基本操作,针对的就是普通文件和目录,本小节将详细解释相关命令。
1、当前路径
到现在为止,我们还不知道自己在系统的什么地方。在浏览器上,我们能够通过导航栏上的url,了解到自己在互联网上的具体坐标。相似的功能,是由pwd
命令提供的,它能够输出当前的工作目录。
pwd
命令是非常非常常用的命令,尤其是在一些命令提示符
设置不太友好的机器上。另外,它也经常用在shell脚本中,用来判断当前的运行目录是否符合需求。
有很多线上事故,都是由于没有确认当前目录所引起的。比如rm -rf *
这种危险的命令。在执行一些高危命令时,随时确认当前目录,是个好的习惯。
[root@localhost ~]# pwd
/root
我们使用root用户默认登陆后,就停留在/root
目录中。Linux中的目录层次,是通过/
进行划分的。
2、文件系统用户标准
Linux的文件系统,从一开始就有一个规范标准。它还有一个专有缩写名词,叫做FHS
(Filesystem Hierarchy Standard)。FHS经过多年的演进,目录结构也越来越清晰。除了一些标准的要求,还有一些使用者之间的约定。
接下来,我们大体看一下linux上的默认目录,对其有一个基本的感觉。
第1层 | 第二层 | 介绍 |
---|---|---|
/bin | 目录/usr/bin的软链接 | |
/sbin | 目录/usr/sbin的软链接 | |
/lib | 目录/usr/lib的软链接 | |
/usr | /bin | 存放一些常用的命令 |
/usr | /sbin | 存放一些管理员常用的命令 |
/usr | /lib | 用来存放动态库和一些模块文件 |
/sys | 内核中的数据结构的可视化接口 | |
/proc | 内存映像 | |
/run | 内存映像 | |
/boot | 存放引导程序,内核相关文件 | |
/dev | 存放一些设备文件 ,比如光盘 | |
/etc | 用于存储一些全局的、应用的配置文件 | |
/var | 与/var/run一样,存放的是系统运行时需要的文件,比如mysql的pid等 | |
/tmp | 非常特殊的临时文件夹,断电丢失 | |
/home | /** | 用户目录,比如我的目录是/home/xjjdog |
/root | root用户的home目录 |
home
平常,我们打交道最多的目录,就集中在自己的用户目录,我们可以在里面做任何操作,比如我们现在root用户的/root
目录。一些自己的资料,比如视频、音频、下载的文件,或者做测试用的一些数据资料,就可以自行在这些目录下规划。root用户比较特殊,普通用户的私人目录都是在/home下的。/etc
etc目录是经常要打交道的目录,存放了一些全局的系统配置文件和应用配置文件。比如你安装了php,或者nginx,它们的配置文件就躺在/etc目录下的某个文件夹里。/var
var目录存放一些运行中的数据,有必须的,也有非必须的。一些黑客入侵之后,会在这里面的某些文件中留下痕迹,他们会着重进行清理。var目录还是一些应用程序的默认数据存放之地,比如mysql的数据文件。/tmp
目录是一个特殊的临时目录,文件在断电以后就消失了。但这个目录,所有的用户,都有写入权限,通常用来做文件交换用。/proc
和/sys
目录,是两个神奇的目录。它们两个是一种伪文件系统,可以通过修改其中一些文件的状态和内容,来控制程序的行为(修改后会直接刷到内存上,太酷了)。刚开始的时候,只有proc目录,由于里面内容有多又乱,后面又规划出sys目录,用来控制内核的一些行为。如果你在调优一些系统参数,和这些文件打交道的时间比较多。还有几个空的目录,我们没有列在上面的表格上。比如
/srv
目录,通常会把一些web服务的资料,比如nginx的,放在这里面。但是,这并不是强制要求的,所以我见过的/srv
目录,通常会一直是空的。同样的,/opt
目录也是这样一个存在,你就当它不存在就行。这都属于使用者规划的范畴,自定义性非常强。在使用Linux系统的时候,也可以创建自己的目录。比如,我就喜欢自己创建一个叫做
/data
的目录,用来存放一些数据库相关的内容。举个例子,/data/mysql
存放mariadb的数据,而/data/es/
存放elasticsearch的索引内容。
linux上的文件类型有很多,它们大部分都分门别类的存放在相应的目录中,比如/dev目录下,就是一些设备文件;/bin文件下,是一些可以执行命令。通常都好记的很。
3、查看文件列表
所以,上面的表格内容,我是怎么看到的呢,靠记忆么?ls
命令,能够列出相关目录的文件信息。可以被评为linux下最勤劳的命令标兵。
现在的终端,都能够输出彩色的信息,非常的直观。
oh-my-zsh
和oh-my-bash
等项目,可以让你的终端更加的漂亮。把它加入到你的研究清单里吧。
[root@localhost /]# ls /# 注意:ls可以接受路径参数,你不用先跳转,就可以输出相关信息bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
[root@localhost /]# ls -l /# 带上 -l参数,可以查看一些更加详细的信息。total 20lrwxrwxrwx. 1 root root 7 Nov 3 20:24 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Nov 3 20:34 boot
drwxr-xr-x. 19 root root 3080 Nov 3 21:19 dev
drwxr-xr-x. 74 root root 8192 Nov 3 20:34 etc
drwxr-xr-x. 2 root root 6 Apr 11 2018 home
lrwxrwxrwx. 1 root root 7 Nov 3 20:24 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 20:24 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 2 root root 6 Apr 11 2018 opt
dr-xr-xr-x. 108 root root 0 Nov 3 21:19 proc
dr-xr-x---. 2 root root 135 Nov 4 07:53 root
drwxr-xr-x. 24 root root 740 Nov 3 21:20 run
lrwxrwxrwx. 1 root root 8 Nov 3 20:24 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Nov 3 21:19 sys
drwxrwxrwt. 9 root root 4096 Nov 4 03:40 tmp
drwxr-xr-x. 13 root root 155 Nov 3 20:24 usr
drwxr-xr-x. 19 root root 267 Nov 3 20:34 var
ls最常用的,就是加参数l
或者参数a
。
3.1、详细信息
加上参数l
,能够看到文件的一些权限信息已经更新日期等。但我们还看到了一些更有意思的东西。比如:
lib -> usr/lib
上面表示的,是软链接信息。
就如同我们上面表格所展示的一样,lib
目录,是/usr/lib
的快捷方式,它们之中的内容,没有什么两样。
关于ls -l
展示的更加详细的内容,可以参照我下面的这张图。我们将在了解后面小节的内容后,再次对这张图进行回顾。
3.2 隐藏文件
直接在你的/root目录里,执行ls -al
,你会看到更多东西。这些额外的隐藏文件,都是以.
开头,以配置文件居多。这就是参数a
的作用。
[root@localhost ~]# ls -al
total 28
dr-xr-x---. 2 root root 135 Nov 4 07:53 .
dr-xr-xr-x. 17 root root 224 Nov 3 20:28 ..
-rw-------. 1 root root 1273 Nov 3 20:28 anaconda-ks.cfg
-rw-------. 1 root root 246 Nov 4 11:41 .bash_history
-rw-r--r--. 1 root root 18 Dec 28 2013 .bash_logout
-rw-r--r--. 1 root root 176 Dec 28 2013 .bash_profile
-rw-r--r--. 1 root root 176 Dec 28 2013 .bashrc
-rw-r--r--. 1 root root 100 Dec 28 2013 .cshrc
-rw-r--r--. 1 root root 129 Dec 28 2013 .tcshrc
细心的同学,应该会注意到两个特殊的目录。.
和..
。前者表示的是当前目录,而后者表示的是上层目录。
使用cd
命令,将在这些目录中,自由穿梭。
小技巧:如果你对英文日期阅读困难,可以使用
ls -al --full-time
查看可读的日期。
4、切换目录
执行cd命令,可以将工作目录切换到目标文件夹。为了展示cd命令的效果。请在root用户下,执行下面的命令,这将创建一个7层的目录。
cd
mkdir -p a1/b2/c3/d4/e5/f6/{g7,g8,g9,g10}
我们使用cd命令,切换到最后一层。然后,我们使用..
切换到上层目录。
[root@localhost ~]# cd a1/b2/c3/d4/e5/f6/g7
[root@localhost g7]# pwd
/root/a1/b2/c3/d4/e5/f6/g7
[root@localhost g7]# cd ..
[root@localhost f6]# pwd
/root/a1/b2/c3/d4/e5/f6
所以,切换到上面n层目录,只需使用多层级的../
即可。有几个特殊的变量,需要说明一下。
../
指的是上层目录../../
指的是上两层目录./
指的是当前目录~
指的是当前的用户目录,这是一个缩写符号-
使用它,可以在最近两次的目录中来回切换
我们来使用命令把上面这些特殊变量验证一下。
# 跳转到用户根目录
[root@localhost tmp]# cd ~
[root@localhost ~]# pwd
/root
# 进入到第三层目录
[root@localhost ~]# cd a1/b2/c3/
[root@localhost c3]# pwd
/root/a1/b2/c3
# 跳回到前三层目录
[root@localhost c3]# cd ../../..
[root@localhost ~]# pwd
/root
# 跳到上次访问的目录
[root@localhost ~]# cd -
/root/a1/b2/c3
[root@localhost c3]# pwd
/root/a1/b2/c3
# 进入当前目录:等于什么都没干
[root@localhost c3]# cd ./
[root@localhost c3]# pwd
/root/a1/b2/c3
以上就是cd命令的常用用法。现在,我们返回头来看一下mkdir
。顾名思义,就是创建目录的意思,但一般在工作中,都会加上-p
参数,这样就可以一次性创建多层目录。注意mkdir后面的大括号{}
,可以一次性的指定多个目录进行创建,这通常能节省很多时间。
5、文件操作
使用命令行操作文件,是非常方便的。
touch
新建文件cp
复制文件mv
移动文件rm
删除文件
这四个风骚的命令,主宰着文件资料的去向。我们依然使用上面创建的目录,进行接下来的操作。
# 创建三个文件
[root@localhost ~]# touch long-long-long.txt
[root@localhost ~]# touch 996.txt
[root@localhost ~]# touch icu.txt
[root@localhost ~]# ls
996.txt a1 anaconda-ks.cfg icu.txt long-long-long.txt
# 复制一个文件
[root@localhost ~]# cp 996.txt 007.txt
[root@localhost ~]# mv long-long-long.txt short.txt
[root@localhost ~]# ls
007.txt 996.txt a1 anaconda-ks.cfg icu.txt short.txt
# 移动996.txt到a1目录,icu.txt到a1/b2目录
# 删除short.txt
[root@localhost ~]# mv 996.txt a1/
[root@localhost ~]# mv icu.txt a1/b2/
[root@localhost ~]# rm short.txt
rm: remove regular empty file ‘short.txt’? y
# 递归删除a1目录
[root@localhost ~]# rm -rvf a1/
removed directory: ‘a1/b2/c3/d4/e5/f6/g7’
removed directory: ‘a1/b2/c3/d4/e5/f6/g8’
removed directory: ‘a1/b2/c3/d4/e5/f6/g9’
removed directory: ‘a1/b2/c3/d4/e5/f6/g10’
removed directory: ‘a1/b2/c3/d4/e5/f6’
removed directory: ‘a1/b2/c3/d4/e5’
removed directory: ‘a1/b2/c3/d4’
removed directory: ‘a1/b2/c3’
removed ‘a1/b2/icu.txt’
removed directory: ‘a1/b2’
removed ‘a1/996.txt’
removed directory: ‘a1/’
[root@localhost ~]# ls
007.txt anaconda-ks.cfg
经过一番操作以后,只剩下了007了。除了上面基本的操作,接下来我要介绍一些更加重要的功能。
可以看到在使用rm
删除文件的时候,进行了一次提示。这是为了避免误删除一些东西,但有时候,你需要不显示这种提示,就可以加-f
参数。f
参数对于cp、mv等命令来说,同样适用,它是force
的意思。
rm -f file
cp -f file1 file2
mv -f file1 file2
另外,还有一个参数-r
,这是递归的意思。我们的目录和文件,通常有多个层次,递归可以把操作全部作用于上面,比如上面的递归删除a1目录。
# 警告:以下命令会造成严重后果
rm -rf /
上面的这个命令,你一定经常看到。这不是笑话,已经有很多用户因此丢失了数据,这就是传说中的删根
,最终你将一无所有。那参数v
又是干什么用的呢?加上它之后,可以看到命令详细的执行过程。在平常的操作中,我一般都加上。
6、小结
本文介绍了linux上的一些基本操作,能够让我们在系统中任意漫游。这一小节比较啰嗦,主要是照顾新接触的同学,后面的命令,我们会慢慢简化。让我们再回顾一下这些命令。
# 创建目录和父目录a,b,c,d
mkdir -p a/b/c/d
# 拷贝文件夹a到/tmp目录
cp -rvf a/ /tmp/
# 移动文件a到/tmp目录,并重命名为b
mv -vf a /tmp/b
# 删除tmp目录的所有文件
rm -rvf /tmp/*
# 创建目录hi,并立即删除它。注意中间的&&
mkdir hi && rmdir hi
7、思考&扩展
1、我能够把cd ../../../../..
这种繁琐的命令缩写么?(提示:alias命令)
2、Linux上文件类型都有哪些?
END
计算机系统,比人拥有更少的隐藏。它的强逻辑性,使得一切都变的透明。但配合使用人员的千八百种操作,它又赋予了不同的意义。
对Linux来说,
有的人,把它当成吃饭的家伙,多学一点都感觉浪费生命。
有的人,把它当成一种兴趣,狂热的想要了解它的方方面面。
有的人,把它当成一个玩具,只有在无聊寂寞的时候才想到它。
有的人,把它包装成神一般的存在,疯狂的收割韭菜。
有的人,把它用在项目中,让效率如虎添翼。
而有的人,用它埋下一个炸弹,让它和老板原地爆裂…
对于小王来说,挑战性不仅仅是妹子是什么样的人,更重要的是他想变成什么样的人。
以铜为鉴,可以正衣冠;以人为鉴,可以明得失;以史为鉴,可以知兴替。可爱情是个啥,却无以为鉴。