第七章 Linux 档案与目录管理
1. 以下是一些比较特殊的目录:
1) . 代表此层目录
2) .. 代表上一层目录
3) - 代表前一个工作目录
4) ~ 代表『目前用户身份』所在的家目录
5) ~account 代表 account 这个用户的家目录(account是个账号名称)
2. 根目录的上一层(..)与根目录自己(.)是同一个目录。
3. cd path 指令是用来改变当前工作目录的( change directory之意)。如果没有加上任何路径,是代表回到自己家目录。
4. pwd是Print Working Directory的缩写,也就是显示目前所在目录的指令。通常Linux提示符仅列出全路径上最后面那一个目录而已,这个时候你就可以使用pwd知道你所在的目录。-P 选项可以让我们取得真正的目录名称,而不是以链接文件的路径来显示的。
5. 如果想要建立新的目录,可以使用mkdir (make directory)指令: mkdir [-mp] 目录名称。在默认情况下, 你所需要的目录得一层一层地建立才行。-p 这个选项可以依序地建立起你指定路径上所有不存在的每一层目录,并且, 如果该目录已经存在,系统也不会报错。 -m 选项可以强制设定新创建的目录的相关权限。例如-m 711 给予新的目录 drwx--x--x 的权限。不过,如果没有给予 -m 选项时, 目录的权限就是系统默认的新建目录权限。
6. 如果要删除目录,可以使用rmdir (remove directory)指令。默认情况下,目录需要一层一层地删除才行!而且被删除的目录里面不能存在其它的目录或档案。-p 选项的作用是,如果目标目录删除后,你所指定的目标路径的上一层路径也为空时,则上层的目录也会一并删除,依此递归直到你所指定的路径的最上层目录。例如:
$ mkdir ll/ss/kk -p <-- 直接建立多层目录 $ cd ll <-- 进入第一层目录 $ rmdir ../ll/ss/kk -p <-- 层级删除目录 rmdir: failed to remove directory '..': Directory not empty <-- ..也会被请求删除 $ ls <-- ll目录下的目录已经删除 $ cd .. <-- 回到上层目录 .. $ ls <-- 上层目录也为空,ll目录也已被删除
7. 当我们在执行一个指令时,比如『ls』,系统会依照PATH的设定去每个PATH定义的目录下搜寻文件名为ls的可执行文件,如果在PATH定义的目录中有多个文件名为ls的可执行文件,那么先搜寻到的同名指令先被执行。PATH(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)隔开, 每个目录是有『顺序』区分的。可以用『echo $PATH』来查看PATH的内容。 echo有『显示、打印』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前 PATH 变量的值。
8. 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同。
9. Linux的档案所记录的信息太多,ls 没有必要全部都列出, 所以, ls默认只显示非隐藏档的档名,并以档名排序以及以蓝色显示目录,以白色显示一般档案。更多的ls选项如下:
选项 | 功能 |
-a | 全部的档案,连同隐藏档一起列出(常用) |
-A | 全部的档案,连同隐藏档,但不包括 . 与 .. 这两个目录 |
-d | 仅列出目录本身,而不是列出目录内的档案数据(常用) |
-f | 不进行排序 (默认会以档名排序) |
-F | 根据档案、目录等信息,在档名后附加信息,例如: *:代表可执行文件; /:代表目录;=:代表 socket 档案; |:代表 FIFO 档案 |
-i | 列出 inode 号码 |
-h | 将档案容量以人类较易读的方式(例如 GB, KB 等等)列出 |
-l | 长数据串输出,包含档案的属性与权限等等数据;(常用) |
-n | 列出 UID 与 GID 而非使用者与群组的名称 |
-r | 将排序结果反向输出 |
-R | 连同子目录内容一起列出 |
-S | 以档案容量大小排序 |
-t | 依最后修改时间排序 |
--color=never | 不要依据档案特性给予颜色显示 |
--color=always | 始终显示颜色 |
--color=auto | 让系统自行依据设定来判断是否给予颜色 |
--full-time | 以完整时间模式 (包含年、月、日、时、分) 输出 |
--time={atime,ctime} | 输出 access 时间(atime)或改变权限属性时间 (ctime) 而非内容变更时间 (modification time) |
10. 很多 distribution 默认已经将 ll (L 的小写) 设定成为 ls -l 的意思了。其实,那个功能是 Bash shell 的 alias 功能。
11. 要复制档案,可以使用 cp (copy) 这个指令。cp 还可以建立连结档 (就是快捷方式),比对两档案的新旧而予以更新, 以及复制整个目录等。其语法如下:
cp [-adfilprsu] 源文件(source) 目标文件(destination) cp [options] source1 source2 source3 .... directory
选项说明如下:
选项 | 功能 |
-a | 相当于 -pdr ;(常用) |
-d | 若源文件为链接文件(link file),则复制链接文件而非档案本身 |
-f | 为强制(force)的意思,若目标档案已经存在且无法打开,则移除后再尝试一次 |
-i | 若目标文件(destination)已经存在,在覆盖时会先询问(常用) |
-l | 进行硬式连结(hard link)的连结档建立,而非复制档案本身 |
-p | 连同档案的属性一起复制过去,而非使用默认属性(备份常用) |
-r | 递归持续复制,用于目录的复制行为;(常用) |
-s | 复制成为符号链接文件 (symbolic link),亦即『快捷方式』档案 |
-u | 若 destination 比 source 旧才更新 destination |
如果来源档有两个以上,则最后一个目标文件一定要是『目录』才行。在默认情况下, cp 的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是指令操作者本身,目标文件的最后修改时间也会是指令执行的时间。-l 就是所谓癿实体链接(hard link),至亍 -s 则是符号链接(symbolic link)
11. 要删除文件,可以使用rm (remove)指令。其语法如下:
rm [-fir] 档案或目录
选项说明如下:
选项 | 功能 |
-f | 就是 force 的意思,忽略不存在的档案,不会出现警告讯息 |
-i | 互动模式,在删除前会询问使用者 |
-r | 递归删除 |
通常在Linux系统下,为了怕档案被误删,所以很多 distributions 都已经默认加入 -i 这个选项了。档名最好不要使用 "-" 号开头, 因为 "-" 后面接的是选项,单纯地使用『 rm -aaa- 』就会误判。所以只能用避过首位字符是 "-" 的方法。就是加上本目录『 ./ 』即可。其实还有一种方法,那就是『 rm -- -aaa- 』。
12. 在指令前加上反斜杠\,可以忽略掉 alias 的指定选项。
13. 当你要移动档案或更名时,可以使用mv (move)指令。其语法如下:
mv [-fiu] source destination mv [options] source1 source2 source3 .... directory
选项说明如下:
选项 | 功能 |
-f | 就是 force 的意思,如果目标档案已经存在,不会询问而直接覆盖 |
-i | 若目标档案 (destination) 已经存在,就会询问是否覆盖 |
-u | 若目标档案已经存在,且 source 比较新,才会更新 (update) |
14. 在 Linux 下还有个指令 rename ,该指令可以对多个文件同时更名,并非针对单一档名变更,与mv不同。请man rename。
15. basename 与 dirname 的用途:
# basename /etc/sysconfig/network network <== 就取得最后的档名 # dirname /etc/sysconfig/network /etc/sysconfig <== 取得的是目录名
16. 以下指令可以查阅一个档案的内容:
cat :由第一行开始显示档案内容。
tac :从最后一行开始显示,可以看出 tac 是 cat 倒着写。
nl :显示的时候,输出行号。
more :一页一页地显示档案内容。
less :与 more 类似,但它可以往前翻页。
head :只看头几行
tail :只看最后几行
od :以二进制方式显示档案内容
17. cat 是 Concatenate (连续)的简写, 主要的功能是将一个档案的内容连续地显示在屏幕上。选项说明如下:
选项 | 功能 |
-A | 相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已 |
-b | 列出行号,仅针对非空白行做行号显示,空白行不标行号 |
-E | 将结尾的断行字符 $ 显示出来 |
-n | 打印出行号,连同空白行也会有行号,与 -b 选项不同 |
-T | 将 [tab] 键以 ^I 显示出来 |
-v | 列出一些看不出来的特殊字符 |
每一行后面都会有断行符,不过断行字符 $ 在Windows/Linux则不太相同,Windows的断行字符是 ^M$。
18. nl默认显示的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等。选项说明如下:
选项 | 功能 |
-b | 指定空白行显示行号的方式,主要有两种: -b a :表示不论是否为空行,也同样列出行号(类似 cat -n); -b t :如果有空行,空的那一行不要列出行号(默认值); |
-n | 列出行号表示的方法,主要有三种: -n ln :行号在行号显示列的最左方显示; -n rn :行号在行号显示列的最右方显示,且不加 0 ; -n rz :行号在行号显示列的最右方显示,且加 0 ; |
-w | 行号字段的占用位数 |
19. 如果 more 后面接的档案内容行数大于屏幕输出的行数时,最后一行会显示出目前显示的百分比, 而且还可以在最后一行输入一些有用的指令:
按键 | 功能 |
空格键 (space) | 代表向下翻一页 |
[Enter] | 代表向下翻『一行』 |
/字符串 | 代表在这个显示的内容中,向下搜寻『字符串』这个关键词 |
:f | 立刻显示出文件名以及目前显示的行数 |
q | 代表立刻离开 more ,不再显示该档案内容 |
b 或 [ctrl]-b | 代表往回翻页,不过这动作只对档案有用,对管道无用 |
20. less比more具备更多的功能:
按键 | 功能 |
空格键 (space)、[pagedown] | 代表向下翻一页 |
[pageup] | 代表向上翻一页 |
/字符串 | 向下搜寻『字符串』这个关键词 |
?字符串 | 向上搜寻『字符串』这个关键词 |
n | 重复前一个搜寻 (与 / 或 ? 有关) |
N | 反向地重复前一个搜寻 (与 / 或 ? 有关) |
q | 代表立刻离开 more ,不再显示该档案内容 |
man这个指令就是呼叫 less 来显示说明文件的内容的。
21. head [-n number] 档案 可以显示出一个档案的前几行。默认只显示十行。-n 选项可以指定要显示的行数,如果为负数,则表示除了最后多少行,别的都显示。例如-n -100时,代表显示文件的开头的所有行数, 但不包括最后100行。其实这里减号表示除去。
22. tail [-n number] 档案 可以显示文件的最后面几行。默认显示最后十行,若要显示非十行,就加 -n 的选项即可。-n +100代表该档案从100行以后都会被显示出来。这里加号表示要显示的意思。如果要显示的文件随时会有数据写入,你想要让该文件一有新数据写入时就立刻显示到屏幕上, 就利用 -f 这个选项,它可以一直侦测这个文件,新加入的数据都会被显示到屏幕上,直到你按下[crtl]-c才会离开tail的侦测。
23. 如果想要显示 /etc/man.config 的第 11 到第 20 行,可以使用『 head -n 20 /etc/man.config | tail -n 10 』。
24. 利用od指令令可以将 data file 或者是 binary file 的内容数据显示出来。其语法如下:
od [-t TYPE] 档案TYPE的取值有如下几种:
a :利用默认的字符集来输出;
c :使用 ASCII 字符集输出
d[size] :利用十进制(decimal)来输出数据,每个整数占用 size bytes ;
f[size] :利用浮点数(floating)来输出数据,每个数占用 size bytes ;
o[size] :利用八进制(octal)来输出数据,每个整数占用 size bytes ;
x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size bytes ;
25. 每个档案在linux底下都会记录三个主要的变动时间:
1) modification time (mtime): 当该档案的『内容数据』变更时,就会更新这个时间。
2) status time (ctime): 当该档案的『状态 (status)』改变时,就会更新这个时间,例如,像是权限与属性被更改了,都会更新这个时间啊。
3) access time (atime): 当『该档案的内容被取用』时,就会更新这个读取时间 (access)。例如,我们使用 cat 去读取文件, 就会更新该文件的 atime 。
在默认的情况下,ls 显示的是文件的 mtime ,也就是这个文件的内容上次被更改的时间。
26. 你可以在一行指令当中写入多重指令,指令间以分号隔开, 这些指令可以『依序』执行。
27. touch指令可以使文件的三个时间 (atime/mtime/ctime) 都变成当前的系统时间,如果档案不存在,则建立新档案。其选项如下:
选项 | 功能 |
-a | 仅修改 access time |
-c | 仅修改档案的时间,若该档案不存在则不建立新档案 |
-d | 后面可以接欲修改的日期而不用目前的日期,也可以使用 --date="日期或时间" |
-m | 仅修改 mtime |
-t | 后面可以接欲修改的时间而不用目前的时间,格式为[YYMMDDhhmm] |
28. 在使用cp -a复制文件时,我们可以发现数据的内容与属性是被复制过来的,因此档案内容时间(mtime)与原档案相同。 但是由于这个档案是刚刚被建立的,因此状态(ctime)与读取时间(atime)就成了现在的时间。
29. umask 就是指定 『目前用户在建立档案或目录时候的权限默认值』。可以直接输入 umask ,就可以看到数字型式的权限设定值, 一种则是加入 -S (Symbolic) 这个选项,就会以符号的方式来显示出权限。umask 会有四组数字,第一组是特殊权限,后三组分别是u,g,o权限。但它所表示的意思是,要从默认权限上扣除什么权限。默认权限对文件来说是 -rw-rw-rw-,对目录来说则是 drwxrwxrwx。所以,umask后三组数为022时,表示用户建立文档时,文件权限为:-rw-r--r--,目录权限为:drwxr-xr-x。直接在umask后输入权限值就可以修改umask。例如 umask 022。root 的 umask 默认是 022。
30. 可以用chattr改变文件的隐藏属性,其语法如下:
chattr [+-=][ASacdistu] 档案或目录名称选项与参数说明:
选项 | 功能 |
+ | 增加某一个特殊参数,其他原本存在的参数则不动 |
- | 移除某一个特殊参数,其他原本存在的参数则不动 |
= | 设定特殊参数为其后面接的参数 |
A | 若你有存取此属性的档案(或目录)时,他的访问时间 atime 将不会被修改,可避免I/O较慢的机器过度地存取磁盘。这对速度较慢的计算机有帮助 |
S | 一般档案是异步写入磁盘的,当具有此属性时,你所进行的任何该档案的修改都会『同步』写入磁盘中 |
a | 具有该属性的档案将只能增加数据,而不能删除或修改数据,只有root 才能设定这个属性 |
c | 这个属性设定后,会自动将此档案『压缩』,在读取的时候将会自动解压缩, 但是在储存的时候,将会先进行压缩后再储存 |
d | 当dump 程序被执行的时候,设定该属性将可使该档案(或目录)不会被 dump 备份 |
i | 具有该属性的文件『不能被删除、改名、设定连结也无法 写入或新增数据』,对于系统安全性有相当大的帮助。只有 root 能设定此属性。 |
s | 具有该属性的档案被删除时,会被完全地移除出硬盘空间,所以如果误删了,完全无法救回来。 |
u | 与 s 相反,具有该属性的档案被删除时,则数据内容其实还存在磁盘中,可以恢复该档案。 |
31. 可以利用 lsattr 来查阅隐藏的属性,其选项说明如下:
选项 | 功能 |
-a | 将隐藏文件的属性也显示出来 |
-d | 如果接的是目录,仅列出目录本身的属性而非目录内的文件 |
-R | 连同子目录的数据也一并显示出来 |
32. 当 s 这个标志出现在档案拥有者的 x 权限上时,例如 /usr/bin/passwd 这个档案的权限状态是:『-rwsr-xr-x』,此时就被称为 Set UID,简称为 SUID 的特殊权限。 基本上SUID有如下功能:
1) SUID 权限仅对二进制程序(binary program)有效;
2) 执行者对于该程序需要具有 x 的可执行权限;
3) 本权限仅在执行该程序的过程中有效 (run-time);
4) 执行者将具有该程序拥有者 (owner) 的权限。
例如,所有账号的密码都记录在 /etc/shadow 这个档案里面,这个档案的权限为:『-r-------- 1 root root』,意思是这个档案仅有root可读且仅有root可以强制写入而已。但一般用户还是可以输入『passwd』这个指令来修改自己的密码,其原因如下:
1) 一般用户对于 /usr/bin/passwd 这个程序具有 x 权限
2) passwd 的拥有者是 root 这个账号;
3) 一般用户在执行 passwd 的过程中,会『暂时』获得 root 的权限;
4) /etc/shadow 就可以被一般用户所执行的 passwd 所修改。
SUID 仅可用在binary program 上, 不能够用在 shell script 上面,SUID 对于目录也是无效的。
33. s 在群组的 x 权限出现时则称为 Set GID 或SGID,SGID 可以针对档案或目录来设定:
1) SGID 对二进制程序有用;
2) 程序执行者对于该程序来说,需具备 x 的权限;
3) 执行者在执行的过程中将会获得该程序群组的支持;
当一个目录设定了 SGID 的权限后,他将具有如下的功能:
1) 用户若对于此目录具有 r 与 x 的权限时,该用户能够进入此目录;
2) 用户在此目录下的有效群组(effective group)将会变成该目录的群组;
3) 用途:若用户在此目录下具有 w 的权限(可以新建档案),则使用者所建立的新档案,该新档案的群组与此目录的群组相同。
34. Sticky Bit, SBIT 目前只针对目录有效,对于档案已经没有效果了。 SBIT 对于目录的作用是:当用户对于此目录具有 w, x 权限时,用户在该目录下建立档案或目录时,仅有自己与 root 才有权力删除该档案。例如:/tmp 本身的权限是『drwxrwxrwt』,在这样的权限下,任何人都可以在 /tmp 内新增、修改档案,但仅有该档案/目录的建立者与 root 能够删除自己的目录或档案。
35. 数字型式更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表SUID, SGID, SBIT了。例如:chmod 6755 test表示加入SUID和SGID权限。也可以通过符号方式设定这些权限,其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t。
36. file指令可以查看某个档案的基本数据,例如是属于 ASCII 或者是 data 档案,或者是 binary ,且其中有没有使用到动态函数库 (share library) 等等的信息。
37. which指令是根据『PATH』这个环境变量所指定的路径,去搜寻『执行档』的档名的。且 which 后面接的是『完整档名』,若加上 -a 选项,则可以列出所有的可以找到的同名执行文件,而非仅显示第一个找到的而已。cd 是『bash 内建的指令』,但是 which 默认是找 PATH 内所设定的目录,所以一定找不到,我们可以透过 type 这个指令找到它。
38. find 不很常用的,因为速度慢之外, 也很费硬盘。通常我们都是先使用 whereis 或者是 locate 来查找文件,如果真的找不到了,才以 find 来搜寻。因为 whereis 与 locate 是利用数据库来搜寻数据并没有实际地搜寻硬盘,比较省时间。Linux 系统会将系统内的所有档案都记录在一个数据库档案里面, 而当使用 whereis 或者是 locate 时,都会以此数据库档案的内容为准, 因此,有的时候你还会发现使用这两个执行档时,会找到已经被删除的档案,而且也找不到最新建立的档案。
39. whereis 指令可以搜索指定文件名的文件,其选项如下:
选项 | 功能 |
-b | 只找 binary 格式的档案 |
-m | 只找在说明文件 manual 路径下的档案 |
-s | 只找 source 源文件 |
-u | 搜寻不在上述三个项目中的其他特殊档案 |
40. 直接在locate指令后面输入『档案的部分名称』后,就能够搜索档案。 例如,输入 locate passwd ,那么在完整文件名 (包含路径名称) 中,只要有 passwd 在其中, 就会被显示出来。-i 选项可以忽略大小写的差异; -r 选项后面可接正则表达式来搜索文件。locate 寻找癿数据是由『已建立的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,而数据库的建立默认是在每天执行一次 (每个 distribution 都不同)。而updatedb指令会根据 /etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新 /var/lib/mlocate 内的数据库档案。
41. find指令的语法如下:
find [PATH] [option] [action]选项说明如下:
选项 | 功能 |
与时间有关的选项: | |
-mtime n | 列出在 n 天之前的『那一天内』被改动过内容的档案 |
-mtime +n | 列出在 n 天之前(不含 n 天本身)被改动过内容的档案 |
-mtime -n | 列出在 n 天之内(含 n 天本身)被更改过内容的档案 |
-newer file | file 为一个存在的档案,列出比 file 还要新的档案 |
时间参数的含意: | |
与使用者或组名有关的选项: | |
-uid n | n为用户的账号 ID,亦即 UID。列出拥有者为指定UID的档案 这个 UID 是记录在 /etc/passwd 里面与账号名称对应的数字 |
-gid n | n是组名的 ID,亦即 GID。列出所属组为指定GID的档案 这个 GID 记录在 /etc/group |
-user name | 功能与-uid n相同,name 为使用者账号名称 |
-group name | 功能与-gid n相同,name 为组名称 |
-nouser | 寻找拥有者不存在于 /etc/passwd 里的档案 |
-nogroup | 寻找档案的群组不存在于 /etc/group 里的档案 |
与档案权限及名称有关的选项: | |
-name filename | 搜寻文件名为 filename 的档案 |
-size [+-]SIZE | 搜寻比 SIZE 还要大(+)或小(-)癿档案 SIZE 的规格有: c: 代表 byte, k: 代表kB |
-type TYPE | 搜寻档案的类型为 TYPE 的档案,档案类型有: 一般正规档案 (f), 装置档案 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等 |
-perm mode | 搜寻档案权限『刚好等亍』 mode 的档案 |
-perm -mode | 搜寻档案权限『必须要全部囊括 mode 权限』的档案 |
-perm +mode | 搜寻档案权限『必须包含 mode 权限中的某一权限』的档案 |
额外可进行的动作: | |
-exec command | command 为其它指令,-exec 后面可再接额外的指令来处理搜寻到的结果, 这里接的指令不支持命令别名。 例如:find / -perm +7000 -exec ls -l {} \; {} 代表的是『由 find 找到的内容』,-exec 与 \; 是关键词,代表 find 额外 动作的开始 (-exec) 到结束 (\;) ,在这中间的就是 find 指令的额外动作。 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜杠来转意。 |
将结果打印到屏幕上,这个动作是默认的 |
find 后面可以接多个目录来进行搜寻, find 本来就会搜寻子目录。
42. 找出 /etc 底下,档案大小介于 50K 到 60K 之间的档案,并将权限完整地列出 (ls -l):
find /etc -size +50k -a -size -60k -exec ls -l {} \;
-a 是 and 癿意忠,为符合两者才算成功。-o则是or的意思。
找出 /etc 底下,档案容量大于 50K 且档案所属人不是 root 的档名,并将权限完整地列出 (ls -l):
find /etc -size +50k -a ! -user root -exec ls -ld {} \;
那个 ! 代表癿是反向选择