第七章 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.  lessmore具备更多的功能:

按键 功能
空格键 (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)  用户若对于此目录具有 rx 的权限时,该用户能够进入此目录;

    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 来搜寻。因为 whereislocate 是利用数据库来搜寻数据并没有实际地搜寻硬盘,比较省时间。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 环境下是有特殊意义的,因此利用反斜杠来转意。

-print 将结果打印到屏幕上,这个动作是默认的

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 {} \;

那个 ! 代表癿是反向选择

猜你喜欢

转载自seanzhou.iteye.com/blog/2017473