Linux学习-1
1.文件系统的常识
本文主要引用鸟哥的Linux私房菜
1.1 常见的标识介绍
> [-][rwx][r-x][r--] > 1 234 567 890
1 为:代表这个文件名为目录或文件,本例中为文件(-); 234为:拥有者的权限,本例中
为可读、可写、可执行(rwx); 567为:同群组使用者权限,本例中为可读可执行(rx);
890为:其他使用者权限,本例中为可读(r),就是只读之意
同时注意到,rwx所在的位置是不会改变的,有该权限就会显示字符,没有该权限就变成减号
(-)就是了。
另外,目录与文件的权限意义并不相同,这是因为目录与文件所记录的数据内容不相同所
致。 由于目录与文件的权限意义非常的重要,所以鸟哥将他独立到5.2.3节中的目录与文件之
权限意义中再来谈。
第二栏表示有多少文件名链接到此节点(i-node):
每个文件都会将他的权限与属性记录到文件系统的i-node中,不过,我们使用的目录树却是使
用文件名来记录, 因此每个文件名就会链接到一个i-node啰!这个属性记录的,就是有多少
不同的文件名链接到相同的一个i-node号码去就是了。 关于i-node的相关数据我们会在第七章
谈到文件系统时再加强介绍的。
第三栏表示这个文件(或目录)的“拥有者帐号”
第四栏表示这个文件的所属群组
在Linux系统下,你的帐号会加入于一个或多个的群组中。举刚刚我们提到的例子,class1,
class2, class3均属于projecta这个群组,假设某个文件所属的群组为projecta,且该文件的权
限如图5.2.2所示(-rwxrwx---), 则class1, class2, class3三人对于该文件都具有可读、可
写、可执行的权限(看群组权限)。 但如果是不属于projecta的其他帐号,对于此文件就不具
有任何权限了。
第五栏为这个文件的容量大小,默认单位为Bytes;
第六栏为这个文件的创建日期或者是最近的修改日期:
这一栏的内容分别为日期(月/日)及时间。如果这个文件被修改的时间距离现在太久了,那
么时间部分会仅显示年份而已。 如下所示:
[root@study ~]# ll /etc/services /root/initial-setup-ks.cfg
-rw-r--r--. 1 root root 670293 Jun 7 2013 /etc/services
-rw-r--r--. 1 root root 1864 May 4 18:01 /root/initial-setup-ks.cfg
# 如上所示,/etc/services 为 2013 年所修改过的文件,离现在太远之故,所以只显示年份;
# 至于 /root/initial-setup-ks.cfg 是今年 (2015) 所创建的,所以就显示完整的时间了。
如果想要显示完整的时间格式,可以利用ls的选项,亦即:“ls -l --full-time”就能够显示出完整
的时间格式了!包括年、月、日、时间喔。 另外,如果你当初是以繁体中文安装你的Linux系
统,那么日期字段将会以中文来显示。 可惜的是,中文并没有办法在纯文本的终端机模式中
正确的显示,所以此栏会变成乱码。 那你就得要使用“export LC_ALL=en_US.utf8”来修改语
系喔!
如果想要让系统默认的语系变成英文的话,那么你可以修改系统配置文件“/etc/locale.conf”,
利用第四章谈到的nano来修改该文件的内容,使LANG这个变量成为上述的内容即可。
第七栏为这个文件的文件名
这个字段就是文件名了。比较特殊的是:如果文件名之前多一个“ . ”,则代表这个文件为“隐藏
文件”,例如上表中的.config那一行,该文件就是隐藏文件。 你可以使用“ls”及“ls -a”这两个指
令去感受一下什么是隐藏文件啰!
2.权限对于文件系统的重要性
权限对文件的重要性
文件是实际含有数据的地方,包括一般文本文件、数据库内容档、二进制可可执行文件
(binary program)等等。 因此,权限对于文件来说,他的意义是这样的:
r (read):可读取此一文件的实际内容,如读取文本文件的文字内容等;
w (write):可以编辑、新增或者是修改该文件的内容(但不含删除该文件);
x (eXecute):该文件具有可以被系统执行的权限。
那个可读(r)代表读取文件内容是还好了解,那么可执行(x)呢?这里你就必须要小心啦!
因为在Windows下面一个文件是否具有执行的能力是借由“ 扩展名 ”来判断的, 例如:.exe,
.bat, .com 等等,但是在Linux下面,我们的文件是否能被执行,则是借由是否具有“x”这个权
限来决定的!跟文件名是没有绝对的关系的!
至于最后一个w这个权限呢?当你对一个文件具有w权限时,你可以具有写入/编辑/新增/修改
文件的内容的权限, 但并不具备有删除该文件本身的权限!对于文件的rwx来说, 主要都是
针对“文件的内容”而言,与文件文件名的存在与否没有关系喔!因为文件记录的是实际的数据
嘛!
权限对目录的重要性
文件是存放实际数据的所在,那么目录主要是储存啥玩意啊?目录主要的内容在记录文件名
清单,文件名与目录有强烈的关连啦! 所以如果是针对目录时,那个 r, w, x 对目录是什么意
义呢?
r (read contents in directory):
表示具有读取目录结构清单的权限,所以当你具有读取(r)一个目录的权限时,表示你
可以查询该目录下的文件名数据。 所以你就可以利用 ls 这个指令将该目录的内容列表显
示出来!
w (modify contents of directory):
这个可写入的权限对目录来说,是很了不起的! 因为他表示你具有异动该目录结构清单
的权限,也就是下面这些权限:
创建新的文件与目录;
删除已经存在的文件与目录(不论该文件的权限为何!)
将已存在的文件或目录进行更名;
搬移该目录内的文件、目录位置。 总之,目录的w权限就与该目录下面的文件名异
动有关就对了啦!
x (access directory):
咦!目录的执行权限有啥用途啊?目录只是记录文件名而已,总不能拿来执行吧?没
错!目录不可以被执行,目录的x代表的是使用者能否进入该目录成为工作目录的用途!
所谓的工作目录(work directory)就是你目前所在的目录啦!举例来说,当你登陆Linux
时, 你所在的主文件夹就是你当下的工作目录。而变换目录的指令是“cd”(change
directory)啰!
3.文件种类
文件种类:
我们在刚刚提到使用“ls -l”观察到第一栏那十个字符中,第一个字符为文件的类型。 除了常见
的一般文件(-)与目录文件(d)之外,还有哪些种类的文件类型呢?
正规文件(regular file ): 就是一般我们在进行存取的类型的文件,在由 ls -al 所显示出
来的属性方面,第一个字符为 [ - ],例如 [-rwxrwxrwx ]。另外,依照文件的内容,又大略
可以分为:
纯文本文件(ASCII):这是Linux系统中最多的一种文件类型啰, 称为纯文本文件
是因为内容为我们人类可以直接读到的数据,例如数字、字母等等。 几乎只要我们
可以用来做为设置的文件都属于这一种文件类型。 举例来说,你可以下达“ cat
~/.bashrc ”就可以看到该文件的内容。 (cat 是将一个文件内容读出来的指令)
二进制档(binary):还记得我们在“ 第零章、计算机概论 ”里面的软件程序的运行
中提过, 我们的系统其实仅认识且可以执行二进制文件(binary file)吧?没错~ 你
的Linux当中的可可执行文件(scripts, 文字体批处理文件不算)就是这种格式的啦~
举例来说,刚刚下达的指令cat就是一个binary file。
数据格式文件(data): 有些程序在运行的过程当中会读取某些特定格式的文件,
那些特定格式的文件可以被称为数据文件 (data file)。举例来说,我们的Linux在
使用者登陆时,都会将登录的数据记录在 /var/log/wtmp那个文件内,该文件是一个
data file,他能够通过last这个指令读出来! 但是使用cat时,会读出乱码~因为他是
属于一种特殊格式的文件。瞭乎?
目录(directory): 就是目录啰~第一个属性为 [ d ],例如 [drwxrwxrwx]。
链接文件(link): 就是类似Windows系统下面的捷径啦! 第一个属性为 [ l ](英文L的
小写),例如 [lrwxrwxrwx] ;
设备与设备文件(device): 与系统周边及储存等相关的一些文件, 通常都集中在/dev
这个目录之下!通常又分为两种:
区块(block)设备文件 :就是一些储存数据, 以提供系统随机存取的周边设备,举
例来说,硬盘与软盘等就是啦! 你可以随机的在硬盘的不同区块读写,这种设备就
是区块设备啰!你可以自行查一下/dev/sda看看, 会发现第一个属性为[ b ]喔!
字符(character)设备文件:亦即是一些序列埠的周边设备, 例如键盘、鼠标等
等!这些设备的特色就是“一次性读取”的,不能够截断输出。 举例来说,你不可能
让鼠标“跳到”另一个画面,而是“连续性滑动”到另一个地方啊!第一个属性为 [ c ]。
数据接口文件(sockets): 既然被称为数据接口文件, 想当然尔,这种类型的文件通
常被用在网络上的数据承接了。我们可以启动一个程序来监听用户端的要求, 而用户端
就可以通过这个socket来进行数据的沟通了。第一个属性为 [ s ], 最常在/run或/tmp这些
个目录中看到这种文件类型了。
数据输送档(FIFO, pipe): FIFO也是一种特殊的文件类型,他主要的目的在解决多个
程序同时存取一个文件所造成的错误问题。 FIFO是first-in-first-out的缩写。第一个属性为
[p] 。
4.Linux目录配置
目录的四个类型
可分享的:可以分享给其他系统挂载使用的目录,所以包括可执行文件与使用者的邮件
等数据, 是能够分享给网络上其他主机挂载用的目录;
不可分享的:自己机器上面运行的设备文件或者是与程序有关的socket文件等, 由于仅
与自身机器有关,所以当然就不适合分享给其他主机了。
不变的:有些数据是不会经常变动的,跟随着distribution而不变动。 例如函数库、文件
说明文档、系统管理员所管理的主机服务配置文件等等;
可变动的:经常改变的数据,例如登录文件、一般用户可自行收受的新闻群组等。
事实上,FHS针对目录树架构仅定义出三层目录下面应该放置什么数据而已,分别是下面这
三个目录的定义:
/ (root, 根目录):与开机系统有关;
/usr (unix software resource):与软件安装/执行有关;
/var (variable):与系统运行过程有关。
5.目录的相关操作
我们之前稍微提到变换目录的指令是cd,还有哪些可以进行目录操作的指令呢? 例如创建目
录啊、删除目录之类的~还有,得要先知道的,就是有哪些比较特殊的目录呢? 举例来说,
下面这些就是比较特殊的目录,得要用力的记下来才行:
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表“目前使用者身份”所在的主文件夹
~account 代表 account 这个使用者的主文件夹(account是个帐号名称)
cd:变换目录
pwd:显示目前的目录
mkdir:创建一个新的目录
rmdir:删除一个空的目录
pwd (显示目前所在的目录)
6.取得路径的文件名称与目录名称
每个文件的完整文件名包含了前面的目录与最终的文件名,而每个文件名的长度都可以到达
255 个字符耶! 那么你怎么知道那个是文件名?那个是目录名?嘿嘿!就是利用斜线 (/)
来分辨啊! 其实,取得文件名或者是目录名称,一般的用途应该是在写程序的时候用来判断
之用的啦~ 所以,这部分的指令可以用在第三篇内的 shell scripts 里头喔! 下面我们简单的
以几个范例来谈一谈 basename 与 dirname 的用途!
[root@study ~]# basename /etc/sysconfig/network
network <== 很简单!就取得最后的文件名~
[root@study ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得的变成目录名了!
7.文件系统查阅
cat 由第一行开始显示文件内容
tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
nl 显示的时候,顺道输出行号!
more 一页一页的显示文件内容
less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
head 只看头几行
tail 只看尾巴几行
od 以二进制的方式读取文件内容!
8.文件默认权限:umask
umask
9.观察文件类型:file
如果你想要知道某个文件的基本数据,例如是属于 ASCII 或者是 data 文件,或者是 binary
, 且其中有没有使用到动态函数库 (share library) 等等的信息,就可以利用 file 这个指令
来检阅喔!举例来说:
[root@study ~]# file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文本文件啊!
[root@study ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically
linked (uses shared libs), for GNU/Linux 2.6.32,
BuildID[sha1]=0xbf35571e607e317bf107b9bcf65199988d0ed5ab, stripped
# 可执行文件的数据可就多的不得了!包括这个文件的 suid 权限、相容于 Intel x86-64 等级的硬件平台
# 使用的是 Linux 核心 2.6.32 的动态函数库链接等等。
[root@study ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 这是 data 文件!
10.文件文件名的搜寻
再来谈一谈怎么搜寻文件吧!在 Linux 下面也有相当优异的搜寻指令呦!通常 find 不很常用 的!因为速度慢之外, 也很操硬盘!一般我们都是先使用 whereis 或者是 locate 来检查,如 果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 只找系统中某些特定目录下 面的文件而已,locate 则是利用数据库来搜寻文件名,当然两者就相当的快速, 并且没有实 际的搜寻硬盘内的文件系统状态,比较省时间啦!
whereis 只找系统中某些特定目录下 面的文件而已,locate 则是利用数据库来搜寻文件名
find 不很常用 的!因为速度慢之外, 也很操硬盘
- whereis (由一些特定的目录中寻找文件文件名)
[root@study ~]# whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件
范例一:请找出 ifconfig 这个文件名
[root@study ~]# whereis ifconfig
ifconfig: /sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
范例二:只找出跟 passwd 有关的“说明文档”文件名(man page)
[root@study ~]# whereis passwd # 全部的文件名通通列出来!
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[root@study ~]# whereis -m passwd # 只有在 man 里面的文件名才抓出来!
passwd: /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
- locate / updatedb
[root@study ~]# locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式
范例一:找出系统中所有与 passwd 相关的文件名,且只列出 5 个
[root@study ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
范例二:列出 locate 查询所使用的数据库文件之文件名与各数据数量
[root@study ~]# locate -S
Database /var/lib/mlocate/mlocate.db:
8,086 directories # 总纪录目录数
109,605 files # 总纪录文件数
5,190,295 Bytes in file names
2,349,150 Bytes used to store database
updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库文件;
locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。
- find
[root@study ~]# find [PATH] [option] [action]
选项与参数:
1\. 与时间有关的选项:共有 -atime, -ctime 与 -mtime ,以 -mtime 说明
-mtime n :n 为数字,意义为在 n 天之前的“一天之内”被更动过内容的文件;
-mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件文件名;
-mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件文件名。
-newer file :file 为一个存在的文件,列出比 file 还要新的文件文件名
范例一:将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出
[root@study ~]# find / -mtime 0
# 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前,
# 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内?
# find / -mtime 3 有变动过的文件都被列出的意思!
范例二:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
[root@study ~]# find /etc -newer /etc/passwd
# -newer 用在分辨两个文件之间的新旧关系是很有用的!
2\. 与使用者或群组名称有关的参数:
-uid n :n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在
/etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。
-gid n :n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在
/etc/group,相关的介绍我们会第四篇说明~
-user name :name 为使用者帐号名称喔!例如 dmtsai
-group name:name 为群组名称喔,例如 users ;
-nouser :寻找文件的拥有者不存在 /etc/passwd 的人!
-nogroup :寻找文件的拥有群组不存在于 /etc/group 的文件!
当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者,
这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。
范例三:搜寻 /home 下面属于 dmtsai 的文件
[root@study ~]# find /home -user dmtsai
# 这个东西也很有用的~当我们要找出任何一个使用者在系统当中的所有文件时,
# 就可以利用这个指令将属于某个使用者的所有文件都找出来喔!
范例四:搜寻系统中不属于任何人的文件
[root@study ~]# find / -nouser
# 通过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时,
# 不要太紧张,那有时候是正常的~尤其是你曾经以源代码自行编译软件时。
3\. 与文件权限及名称有关的参数:
-name filename:搜寻文件名称为 filename 的文件;
-size [+-]SIZE:搜寻比 SIZE 还要大(+)或小(-)的文件。这个 SIZE 的规格有:
c: 代表 Byte, k: 代表 1024Bytes。所以,要找比 50KB
还要大的文件,就是“ -size +50k ”
-type TYPE :搜寻文件的类型为 TYPE 的,类型主要有:一般正规文件 (f), 设备文件 (b, c),
目录 (d), 链接文件 (l), socket (s), 及 FIFO (p) 等属性。
-perm mode :搜寻文件权限“刚好等于” mode 的文件,这个 mode 为类似 chmod
的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !
-perm -mode :搜寻文件权限“必须要全部囊括 mode 的权限”的文件,举例来说,
我们要搜寻 -rwxr--r-- ,亦即 0744 的文件,使用 -perm -0744,
当一个文件的权限为 -rwsr-xr-x ,亦即 4755 时,也会被列出来,
因为 -rwsr-xr-x 的属性已经囊括了 -rwxr--r-- 的属性了。
-perm /mode :搜寻文件权限“包含任一 mode 的权限”的文件,举例来说,我们搜寻
-rwxr-xr-x ,亦即 -perm /755 时,但一个文件属性为 -rw-------
也会被列出来,因为他有 -rw.... 的属性存在!
范例五:找出文件名为 passwd 这个文件
[root@study ~]# find / -name passwd
范例五-1:找出文件名包含了 passwd 这个关键字的文件
[root@study ~]# find / -name "*passwd*"
# 利用这个 -name 可以搜寻文件名啊!默认是完整文件名,如果想要找关键字,
# 可以使用类似 * 的任意字符来处理
范例六:找出 /run 目录下,文件类型为 Socket 的文件名有哪些?
[root@study ~]# find /run -type s
# 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件,
# 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找!
范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性
[root@study ~]# find / -perm /7000
# 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000,
# 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000 ~瞭乎?
重点回顾
绝对路径:“一定由根目录 / 写起”;相对路径:“不由 / 写起,而是由相对当前目录写起”
特殊目录有:., .., -, ~, ~account需要注意;
与目录相关的指令有:cd, mkdir, rmdir, pwd 等重要指令;
rmdir 仅能删除空目录,要删除非空目录需使用“ rm -r ”指令;
使用者能使用的指令是依据 PATH 变量所规定的目录去搜寻的;
ls 可以检视文件的属性,尤其 -d, -a, -l 等选项特别重要!
文件的复制、删除、移动可以分别使用:cp, rm , mv等指令来操作;
检查文件的内容(读档)可使用的指令包括有:cat, tac, nl, more, less, head, tail, od 等
cat -n 与 nl 均可显示行号,但默认的情况下,空白行会不会编号并不相同;
touch 的目的在修改文件的时间参数,但亦可用来创建空文件;
一个文件记录的时间参数有三种,分别是 access time(atime), status time (ctime),
modification time(mtime),ls 默认显示的是 mtime。
除了传统的rwx权限之外,在Ext2/Ext3/Ext4/xfs文件系统中,还可以使用chattr与lsattr设
置及观察隐藏属性。 常见的包括只能新增数据的 +a 与完全不能更动文件的 +i 属性。
新建文件/目录时,新文件的默认权限使用 umask 来规范。默认目录完全权限为
drwxrwxrwx, 文件则为-rw-rw-rw-。
文件具有SUID的特殊权限时,代表当使用者执行此一binary程序时,在执行过程中使用
者会暂时具有程序拥有者的权限
目录具有SGID的特殊权限时,代表使用者在这个目录下面新建的文件之群组都会与该目
录的群组名称相同。
目录具有SBIT的特殊权限时,代表在该目录下使用者创建的文件只有自己与root能够删
除!
观察文件的类型可以使用 file 指令来观察;
搜寻指令的完整文件名可用 which 或 type ,这两个指令都是通过 PATH 变量来搜寻文件
名;
搜寻文件的完整文件名可以使用 whereis 找特定目录或 locate 到数据库去搜寻,而不实
际搜寻文件系统;
利用 find 可以加入许多选项来直接查询文件系统,以获得自己想要知道的文件名。