目录与路径

相对路径与绝对路径

  • 绝对路径:路径的写法“一定由根目录 / 写起”
  • 相对路径:路径的写法“不是由 / 写起”

目录的相关操作

  • . 代表此层目录
  • .. 代表上一层目录
  • - 代表前一个工作目录
  • ~ 代表“目前使用者身份”所在的主文件夹
  • ~account 代表 account 这个使用者的主文件夹(account是个帐号名称)

处理目录的指令

  • cd:变换目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@study ~]$ cd [相对路径或绝对路径]
    # 最重要的就是目录的绝对路径与相对路径,还有一些特殊目录的符号啰!
    [root@study ~]$ cd ~dmtsai
    # 代表去到 dmtsai 这个使用者的主文件夹,亦即 /home/dmtsai
    [root@study dmtsai]$ cd ~
    # 表示回到自己的主文件夹,亦即是 /root 这个目录
    [root@study ~]$ cd
    # 没有加上任何路径,也还是代表回到自己主文件夹的意思喔!
    [root@study ~]$ cd ..
    # 表示去到目前的上层目录,亦即是 /root 的上层目录的意思;
    [root@study /]$ cd -
    # 表示回到刚刚的那个目录,也就是 /root 啰~
    [root@study ~]$ cd /var/spool/mail
    # 这个就是绝对路径的写法!直接指定要去的完整路径名称!
    [root@study mail]$ cd ../postfix
    # 这个是相对路径的写法,我们由/var/spool/mail 去到/var/spool/postfix 就这样写!
  • pwd:显示目前的目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@study ~]$ pwd [-P]
    选项与参数:
    -P :显示出确实的路径,而非使用链接 (link) 路径。
    范例:单纯显示出目前的工作目录:
    [root@study ~]$ pwd
    /root <== 显示出目录啦~
    范例:显示出实际的工作目录,而非链接文件本身的目录名而已
    [root@study ~]$ cd /var/mail <==注意,/var/mail是一个链接文件
    [root@study mail]$ pwd
    /var/mail <==列出目前的工作目录
    [root@study mail]$ pwd -P
    /var/spool/mail <==怎么回事?有没有加 -P 差很多~
    [root@study mail]$ ls -ld /var/mail
    lrwxrwxrwx. 1 root root 10 May 4 17:51 /var/mail -&gt; spool/mail
    # 看到这里应该知道为啥了吧?因为 /var/mail 是链接文件,链接到 /var/spool/mail
    # 所以,加上 pwd -P 的选项后,会不以链接文件的数据显示,而是显示正确的完整路径啊!
  • mkdir:创建一个新的目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [root@study ~]$ mkdir [-mp] 目录名称
    选项与参数:
    -m :设置文件的权限喔!直接设置,不需要看默认权限 (umask) 的脸色~
    -p :帮助你直接将所需要的目录(包含上层目录)递回创建起来!
    范例:请到/tmp下面尝试创建数个新目录看看:
    [root@study ~]$ cd /tmp
    [root@study tmp]$ mkdir test <==创建一名为 test 的新目录
    [root@study tmp]$ mkdir test1/test2/test3/test4
    mkdir: cannot create directory ‘test1/test2/test3/test4’: No such file or directory
    # 话说,系统告诉我们,没可能创建这个目录啊!就是没有目录才要创建的!见鬼嘛?
    [root@study tmp]$ mkdir -p test1/test2/test3/test4
    # 原来是要建 test4 上层没先建 test3 之故!加了这个 -p 的选项,可以自行 帮你创建多层目录!
    范例:创建权限为rwx--x--x的目录
    [root@study tmp]$ mkdir -m 711 test2
    [root@study tmp]$ ls -ld test*
    drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
    drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
    drwx--x--x. 2 root root 6 Jun 4 19:05 test2
    # 仔细看上面的权限部分,如果没有加上 -m 来强制设置属性,系统会使用默认属性。
    # 那么你的默认属性为何?这要通过下面介绍的 [umask](../Text/index. html#umask) 才能了解喔! ^_^
  • rmdir:删除一个空的目录
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    [root@study ~]# rmdir [-p] 目录名称
    选项与参数:
    -p :连同“上层”“空的”目录也一起删除
    范例:将于mkdir范例中创建的目录(/tmp下面)删除掉!
    [root@study tmp]# ls -ld test* <==看看有多少目录存在?
    drwxr-xr-x. 2 root root 6 Jun 4 19:03 test
    drwxr-xr-x. 3 root root 18 Jun 4 19:04 test1
    drwx--x--x. 2 root root 6 Jun 4 19:05 test2
    [root@study tmp]# rmdir test <==可直接删除掉,没问题
    [root@study tmp]# rmdir test1 <==因为尚有内容,所以无法删除!
    rmdir: failed to remove ‘test1’: Directory not empty
    [root@study tmp]# rmdir -p test1/test2/test3/test4
    [root@study tmp]# ls -ld test* <==您看看,下面的输出中test与 test1不见了!
    drwx--x--x. 2 root root 6 Jun 4 19:05 test2
    # 瞧!利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除 ~
    # 不过要注意的是,这个 rmdir 仅能“删除空的目录”喔!

可执行文件路径的变量: $PATH

  • 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与blackgane);
  • PATH是可以修改的;
  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;
  • 指令应该要放置到正确的目录下,执行才会比较方便;
  • 本目录(.)最好不要放到PATH当中。

文件与目录管理

文件与目录的检视: ls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@study ~]$ ls [-aAdfFhilnrRSt] 文件名或目录名称..
[root@study ~]$ ls [--color={never,auto,always}] 文件名或目录名称..
[root@study ~]$ ls [--full-time] 文件名或目录名称..
选项与参数:
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:
*:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 号码,inode 的意义下一章将会介绍;
-l :长数据串行出,包含文件的属性与权限等等数据;(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)
-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;
-S :以文件大小大小排序,而不是用文件名排序;
-t :依时间排序,而不是用文件名。
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设置来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time)

复制、删除与移动: cp, rm, mv

cp (复制文件或目录)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@study ~]$ cp [-adfilprsu] 来源文件(source) 目标文件(destination)
[root@study ~]$ cp [options] source1 source2 source3 .... directory
选项与参数:
-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明;(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身;
-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次;
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身;
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用);
-r :递回持续复制,用于目录的复制行为;(常用)
-s :复制成为符号链接文件 (symbolic link),亦即“捷径”文件;
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制。
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!

在复制时,你必须要清楚的了解到:

  • 是否需要完整的保留来源文件的信息?
  • 来源文件是否为链接文件 (symbolic link file)?
  • 来源文件是否为特殊的文件,例如 FIFO, socket 等?
  • 来源文件是否为目录?

rm (移除文件或目录)

1
2
3
4
5
[root@study ~]$ rm [-fir] 文件或目录
选项与参数:
-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;
-i :互动模式,在删除前会询问使用者是否动作
-r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!

mv (移动文件与目录,或更名)

1
2
3
4
5
6
[root@study ~]$ mv [-fiu] source destination
[root@study ~]$ mv [options] source1 source2 source3 .... directory
选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新 (update)

取得路径的文件名称与目录名称

1
2
3
4
[root@study ~]$ basename /etc/sysconfig/network
network 很简单!就取得最后的文件名~
[root@study ~]$ dirname /etc/sysconfig/network
/etc/sysconfig 取得的变成目录名了!

文件内容查阅

  • cat 由第一行开始显示文件内容
  • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
  • nl 显示的时候,顺道输出行号!
  • more 一页一页的显示文件内容
  • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • head 只看头几行
  • tail 只看尾巴几行
  • od 以二进制的方式读取文件内容!

直接检视文件内容

cat (concatenate)

1
2
3
4
5
6
7
8
[root@study ~]$ cat [-AbEnTv]
选项与参数:
-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
-E :将结尾的断行字符 $ 显示出来;
-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;
-T :将 [tab] 按键以 ^I 显示出来;
-v :列出一些看不出来的特殊字符

tac (反向列示)

cat的相反用法

nl (添加行号打印)

1
2
3
4
5
6
7
8
9
10
[root@study ~]$ nl [-bnw] 文件
选项与参数:
-b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);
-n :列出行号表示的方法,主要有三种:
-n ln :行号在屏幕的最左方显示;
-n rn :行号在自己字段的最右方显示,且不加 0 ;
-n rz :行号在自己字段的最右方显示,且加 0 ;
-w :行号字段的占用的字符数。

可翻页检视

more (一页一页翻动)

  • 空白键 (space):代表向下翻一页;
  • Enter :代表向下翻“一行”;
  • /字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;
  • :f :立刻显示出文件名以及目前显示的行数;
  • q :代表立刻离开 more ,不再显示该文件内容。
  • b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less (一页一页翻动)

  • 空白键 :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup] :向上翻动一页;
  • /字串 :向下搜寻“字串”的功能;
  • ?字串 :向上搜寻“字串”的功能;
  • n :重复前一个搜寻 (与 / 或 ? 有关!)
  • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • g :前进到这个数据的第一行去;
  • G :前进到这个数据的最后一行去 (注意大小写);
  • q :离开 less 这个程序;

数据撷取

head (取出前面几行)

1
2
3
[root@study ~]$ head [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思

tail (取出后面几行)

1
2
3
4
5
[root@study ~]$ tail [-n number] 文件
选项与参数:
-n :后面接数字,代表显示几行的意思
-f :表示持续侦测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的侦测

非纯文本文件: od

1
2
3
4
5
6
7
8
9
[root@study ~]$ od [-t TYPE] 文件
选项或参数:
-t :后面可以接各种“类型 (TYPE)”的输出,例如:
a :利用默认的字符来输出;
c :使用 ASCII 字符来输出
d[size] :利用十进制(decimal)来输出数据,每个整数占用 size Bytes;
f[size] :利用浮点数值(floating)来输出数据,每个数占用 size Bytes;
o[size] :利用八进位(octal)来输出数据,每个整数占用 size Bytes;
x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes;

修改文件时间或创建新文件: touch

linux文件的三个时间:

  1. modification time (mtime): 当该文件的“内容数据”变更时,就会更新这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
  2. status time (ctime): 当该文件的“状态 (status)”改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。
  3. access time (atime): 当“该文件的内容被取用”时,就会更新这个读取时间(access)。举例来说,我们使用 cat 去读取 /etc/man_db.conf , 就会更新该文件的atime 了。
1
2
3
4
5
6
7
[root@study ~]$ touch [-acdmt] 文件
选项与参数:
-a :仅修订 access time;
-c :仅修改文件的时间,若该文件不存在则不创建新文件;
-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
-m :仅修改 mtime ;
-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

文件与目录的默认权限与隐藏权限

文件默认权限:umask

1
2
3
4
[root@study ~]$ umask
0022 <==与一般权限有关的是后面三个数字!
[root@study ~]$ umask -S
u=rwx,g=rx,o=rx
  • umask的利用与重要性:专题制作
1
2
3
4
5
6
[root@study ~]$ umask 002
[root@study ~]$ touch test3
[root@study ~]$ mkdir test4
[root@study ~]$ ll -d test[34] # 中括号 [ ] 代表中间有个指定的字符,而不是任意字符的意思
-rw-rw-r--. 1 root root 0 6月 16 01:12 test3
drwxrwxr-x. 2 root root 6 6月 16 01:12 test4

umask 对于新建文件与目录的默认权限是很有关系的!这个概念可以用在任何服务器上面, 尤其是未来在你架设文件服务器 (file server) ,举例来说, SAMBA Server或者是 FTP server 时, 都是很重要的观念!这牵涉到你的使用者是否能够将文件进一步利用的问题喔!不要等闲视之!

文件隐藏属性

chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能
就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。

chattr (设置文件隐藏属性)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@study ~]$ chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设置一定,且仅有后面接的参数
A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时,当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”
对于系统安全性有相当大的助益!只有 root 能设置此属性
s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来救援该文件喔!
注意1:属性设置常见的是 a 与 i 的设置值,而且很多设置值必须要身为 root 才能设置
注意2:xfs 文件系统仅支持 AadiS 而已

lsattr (显示文件隐藏属性)

1
2
3
4
5
[root@study ~]$ lsattr [-adR] 文件或目录
选项与参数:
-a :将隐藏文件的属性也秀出来;
-d :如果接的是目录,仅列出目录本身的属性而非目录内的文件名;
-R :连同子目录的数据也一并列出来!

文件特殊权限: SUID, SGID, SBIT

Set UID

当 s 这个标志出现在文件拥有者的 x 权限上时,例如刚刚提到的 /usr/bin/passwd 这个文件的权限状态:“-rwsr-xr-x”,此时就被称为 Set UID,简称为 SUID 的特殊权限。

SUID程序执行的过程示意图

  • SUID 权限仅对二进制程序(binary program)有效;
  • 执行者对于该程序需要具有 x 的可执行权限;
  • 本权限仅在执行该程序的过程中有效 (run-time);
  • 执行者将具有该程序拥有者 (owner) 的权限。
  • SUID 不能用在shell script和目录上面。

Set GID

当s 在群组的 x 时则称为 Set GID, SGID

与 SUID 不同的是,SGID 可以针对文件或目录来设置!

对文件来说:

  • SGID 对二进制程序有用;
  • 程序执行者对于该程序来说,需具备 x 的权限;
  • 执行者在执行的过程中将会获得该程序群组的支持!

对目录来说:

  • 使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;
  • 使用者在此目录下的有效群组(effective group)将会变成该目录的群组;
  • 用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文件,该新文件的群组与此目录的群组相同。

Sticky Bit

Sticky Bit, SBIT 目前只针对目录有效。

作用是:

  • 当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;
  • 当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

SUID/SGID/SBIT 权限设置

  • 4 为 SUID
  • 2 为 SGID
  • 1 为 SBIT

假设要将一个文件权限改为-rwsr-xr-x时,由于 s 在使用者权限中,所以是 SUID ,因此,在原先的 755 之前还要加上 4 ,也就是:chmod 4755 filename 来设置。

1
2
3
4
5
6
7
8
9
10
[root@study ~]$ cd /tmp
[root@study tmp]$ touch test <==创建一个测试用空档
[root@study tmp]$ chmod 4755 test; ls -l test <==加入具有 SUID 的权限
-rwsr-xr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]$ chmod 6755 test; ls -l test <==加入具有 SUID/SGID 的权限
-rwsr-sr-x 1 root root 0 Jun 16 02:53 test
[root@study tmp]$ chmod 1755 test; ls -l test <==加入 SBIT 的功能!
-rwxr-xr-t 1 root root 0 Jun 16 02:53 test
[root@study tmp]$ chmod 7666 test; ls -l test <==具有空的 SUID/SGID 权限
-rwSrwSrwT 1 root root 0 Jun 16 02:53 test

最后一个例子出现大写的 S 与 T ,是因为 s 与 t都是取代 x 这个权限的,但是下达的权限是 7666,也就是说, user,group 以及 others 都没有 x 这个可执行的标志( 因为 666 ),所以,这个 S, T 代表的就是“空的”,即都没有执行权限。

SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t 符号法

1
2
3
4
5
6
# 设置权限成为 -rws--x--x 的模样:
[root@study tmp]$ chmod u=rwxs,go=x test; ls -l test
-rws--x--x 1 root root 0 Jun 16 02:53 test
# 承上,加上 SGID 与 SBIT 在上述的文件权限中!
[root@study tmp]$ chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Jun 16 02:53 test

观察文件类型:file

1
2
3
4
5
6
7
8
9
10
[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 文件!

指令与文件的搜寻

指令文件名的搜寻

  • which (寻找“可执行文件”)
1
2
3
[root@study ~]$ which [-a] command
选项或参数:
-a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

文件文件名的搜寻

whereis (由一些特定的目录中寻找文件文件名)

1
2
3
4
5
6
7
[root@study ~]$ whereis [-bmsu] 文件或目录名
选项与参数:
-l :可以列出 whereis 会去查询的几个主要目录而已
-b :只找 binary 格式的文件
-m :只找在说明文档 manual 路径下的文件
-s :只找 source 来源文件
-u :搜寻不在上述三个项目当中的其他特殊文件

locate / updatedb

1
2
3
4
5
6
7
[root@study ~]$ locate [-ir] keyword
选项与参数:
-i :忽略大小写的差异;
-c :不输出文件名,仅计算找到的文件数量
-l :仅输出几行的意思,例如输出五行则是 -l 5
-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等
-r :后面可接正则表达式的显示方式

更新 locate 数据库直接输入updatedb就可以了!

updatedb 指令会去读取 /etc/updatedb.conf 这个配置文件的设置,然后再去硬盘里面进行搜寻文件名的动作, 最后就更新整个数据库文件啰!因为 updatedb 会去搜寻硬盘,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!

  • updatedb:根据 /etc/updatedb.conf 的设置去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件;
  • locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字文件名。

find

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[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 还要新的文件文件名

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 搜寻。

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.... 的属性存在!

4\. 额外可进行的动作:
-exec commandcommand 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
-print :将结果打印到屏幕上,这个动作是默认动作!

find 相关的时间参数意义

  • +4代表大于等于5天前的文件名:ex> find /var -mtime +4
  • -4代表小于等于4天内的文件文件名:ex> find /var -mtime -4
  • 4则是代表4-5那一天的文件文件名:ex> find /var -mtime 4

find 相关的额外动作

该范例中特殊的地方有 {} 以及 \; 还有 -exec 这个关键字,这些东西的意义为:

  • {} 代表的是“由 find 找到的内容”,如上图所示,find 的结果会被放置到 {} 位置中;
  • -exec 一直到 \; 是关键字,代表 find 额外动作的开始 -exec 到结束 \; ,在这中间的就是 find 指令内的额外动作。 在本例中就是 ls -l {} 啰!
  • 因为 ; 在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。

回顾

  1. 让使用者能进入某目录成为“可工作目录”的基本权限为何:

    • 可使用的指令:例如 cd 等变换工作目录的指令;
    • 目录所需权限:使用者对这个目录至少需要具有 x 的权限
    • 额外需求:如果使用者想要在这个目录内利用 ls 查阅文件名,则使用者对此目录还需要 r的权限。
  2. 使用者在某个目录内读取一个文件的基本权限为何?

    • 可使用的指令:例如本章谈到的 cat, more, less等等
    • 目录所需权限:使用者对这个目录至少需要具有 x 权限;
    • 文件所需权限:使用者对文件至少需要具有 r 的权限才行!
  3. 让使用者可以修改一个文件的基本权限为何?

    • 可使用的指令:例如 nano 或未来要介绍的 vi 编辑器等;
    • 目录所需权限:使用者在该文件所在的目录至少要有 x 权限;
    • 文件所需权限:使用者对该文件至少要有 r, w 权限
  4. 让一个使用者可以创建一个文件的基本权限为何?

    • 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!
  5. 让使用者进入某目录并执行该目录下的某个指令之基本权限为何?

    • 目录所需权限:使用者在该目录至少要有 x 的权限;
    • 文件所需权限:使用者在该文件至少需要有 x 的权限