代码改变世界

《鸟哥的Linux私房菜 基础学习篇(第三版)》 第07章 Linux文件与目录管理 笔记

2018-03-28 23:51  受匕图灵  阅读(222)  评论(0)    收藏  举报

一、路径

绝对路径:由根目录(/)开始写起的文件名或目录名称,例如:/home/dmtsai/.bashrc。

相对路径:相对于目前路径的文件名写法。例如:./home/dmtsai或../../home/dmtsai等。

 

二、目录的相关操作

.  代表当前的目录,也可以使用./表示。

..  代表上一层目录,也可以使用../表示。

-  代表前一个工作目录

~  代表“目前用户身份”所在的主文件夹

~accout  代表accout这个用户的主文件夹(accout是个账号名称)

2.1、cd(切换目录)

语法:

  cd [相对路径或绝对路径]

cd是Change Directory的缩写。

仅输入cd时,代表的就是“cd ~”的意思。

 

2.2、pwd(显示目前所在的目录)

语法:

  pwd [-P]

参数:

  -P:显示出当前的路径,而非石油连接(link)路径。

pwd是Print Working Directory的缩写。

 

2.3、mkdir(新建新目录

语法:

  mkdir [-mp] 目录名称

参数:

  -m:配置文件案的权限。直接设置,不需要看默认权限(umask)

  -p:帮助你直接将所需要的目录(包含上层目录)递归创建起来。不过不建议常用,因为担心打错字,那么目录名称就会变得乱七八糟的。

 

2.4、rmdir(删除“空”的目录)

语法:

  redir [-p] 目录名称

参数:

  -p:连同上层“空的”目录也一起删除

如果要将所有目录下的东西都删除掉,就使用rm -r test命令。

 

三、关于执行文件路径的变量: $PATH

  • PATH每个目录中间用冒号(:)来隔开, 每个目录是有‘顺序’之分的。
  • PATH(一定是大写)。
  • 不同身份使用者预设的PATH不同,预设能够随意执行的指令也不同(如root与vbird)。
  • PATH是可以修改的,所以一般使用者还是可以透过修改PATH来执行某些位于/sbin或/usr/sbin下的指令来查询。
  • 使用绝对路径或相对路径直接指定某个指令的档名来执行,会比搜寻PATH来的正确。
  • 指令应该要放置到正确的目录下,执行才会比较方便。
  • 本目录(.)最好不要放到PATH当中。

当我们在执行一个指令的时候,举例来说‘ls’好了,系统会依照PATH的设定去每个PATH定义的目录下搜寻档名为ls的可执行档, 如果在PATH定义的目录中含有多个档名为ls的可执行档,那么先搜寻到的同名指令先被执行!

例题:
为什么PATH搜寻的目录不加入本目录(.)?加入本目录的搜寻不是也不错?
答:
如果在PATH中加入本目录(.)后,确实我们就能够在指令所在目录进行指令的执行了。 但是由于你的工作目录并非固定(常常会使用cd来切换到不同的目录), 因此能够执行的指令会有变动(因为每个目录底下的可执行档都不相同嘛!),这对使用者来说并非好事。

另外,如果有个坏心使用者在/tmp底下做了一个指令,因为/tmp是大家都能够写入的环境,所以他当然可以这样做。 假设该指令可能会窃取使用者的一些资料,如果你使用root的身份来执行这个指令,那不是很糟糕? 如果这个指令的名称又是经常会被用到的ls时,那‘中标’的机率就更高了!

 

四、文件与目录管理

4.1、ls(查看文件与目录)

语法:

  • ls [-aAdfFhilnrRSt] 目录名称
  • ls [--color={never,auto,always}] 目录名称
  • 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)

预设显示的只有:非隐藏档的档名、 以档名进行排序及档名代表的颜色显示如此而已。举例来说, 你下达‘ ls /etc ’之后,只有经过排序的档名以及以蓝色显示目录及白色显示一般档案,如此而已。

 

4.2、cp (复制档案或目录)

语法:

  • cp [-adfilprsu] 来源档(source) 目标档(destination)
  • cp [options] source1 source2 source3 .... directory

选项与参数:

  • -a :相当于 -pdr 的意思,至于 pdr 请参考下列说明;(常用)
  • -d :若来源档为连结档的属性(link file),则复制连结档属性而非档案本身;
  • -f :为强制(force)的意思,若目标档案已经存在且无法开启,则移除后再尝试一次;
  • -i :若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
  • -l :进行硬式连结(hard link)的连结档建立,而非复制档案本身;
  • -p :连同档案的属性一起复制过去,而非使用预设属性(备份常用);
  • -r :递回持续复制,用于目录的复制行为;(常用)
  • -s :复制成为符号连结档 (symbolic link),亦即‘捷径’档案;
  • -u :若 destination 比 source 旧才更新 destination !

范例二:变换目录到/tmp,并将/var/log/wtmp复制到/tmp且观察属性:
[root@www ~]# cd /tmp
[root@www tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘

[root@www tmp]# ls -l /var/log/wtmp wtmp
-rw-rw-r-- 1 root utmp 96384 Sep 24 11:54 /var/log/wtmp
-rw-r--r-- 1 root root 96384 Sep 24 14:06 wtmp

在预设的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。

由于 cp 有种种的档案属性与权限的特性,所以,在复制时,你必须要清楚的了解到:

  • 是否需要完整的保留来源档案的资讯?
  • 来源档案是否为连结档 (symbolic link file)?
  • 来源档是否为特殊的档案,例如 FIFO, socket 等?
  • 来源档是否为目录?

 

4.3、rm (移除档案或目录)

语法:

  • rm [-fir] 档案或目录

选项与参数:

  • -f :就是 force 的意思,忽略不存在的档案,不会出现警告讯息;
  • -i :互动模式,在删除前会询问使用者是否动作
  • -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!!

使用‘ rm -r ’这个指令之前,请千万注意了,因为该目录或档案‘肯定’会被 root 杀掉!因为系统不会再次询问你是否要砍掉呦!所以那是个超级严重的指令下达呦!

删除多个文件除了用通配符外:rm 文件1 文件2


4.4、mv (移动档案与目录,或更名)

语法:

  • mv [-fiu] source destination
  • mv [options] source1 source2 source3 .... directory

选项与参数:

  • -f :force 强制的意思,如果目标档案已经存在,不会询问而直接覆盖;
  • -i :若目标档案 (destination) 已经存在时,就会询问是否覆盖!
  • -u :若目标档案已经存在,且 source 比较新,才会更新 (update)

 

4.5、basename(取得最后的档名)

[root@www ~]# basename /etc/sysconfig/network
network <== 取得最后的档名

 

4.6、dirname(取得目录名)

[root@www ~]# dirname /etc/sysconfig/network
/etc/sysconfig <== 取得目录名

 

五、文件内容查阅

  • 直接查看文件内容:
    • cat 由第一行开始显示档案内容
    • tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
    • nl 显示的时候,顺道输出行号!
  • 可翻页查看:
    • more 一页一页的显示档案内容
    • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
  • 数据选取:
    • head 只看头几行
    • tail 只看尾巴几行
  • 非纯文本文件:
    • od 以二进位的方式读取档案内容!
  • 修改文件时间或创建新文件:
    • touch 

 

5.1、cat (由第一行开始显示档案内容,concatenate)

语法:

  • cat [-AbEnTv]

选项与参数:

  • -A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
  • -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
  • -E :将结尾的断行字元 $ 显示出来;
  • -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
  • -T :将 [tab] 按键以 ^I 显示出来;
  • -v :列出一些看不出来的特殊字符


5.2、tac (从最后一行开始显示)

第一行到最后一行连续显示在荧幕上

 

5.3、nl (添加行号列印)
语法:

  • nl [-bnw] 档案

选项与参数:

  • -b :指定行号指定的方式,主要有两种:
  • -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
  • -b t :如果有空行,空的那一行不要列出行号(预设值);
  • -n :列出行号表示的方法,主要有三种:
  • -n ln :行号在荧幕的最左方显示;
  • -n rn :行号在自己栏位的最右方显示,且不加 0 ;
  • -n rz :行号在自己栏位的最右方显示,且加 0 ;
  • -w :行号栏位的占用的位元数。

 

5.4、more (一页一页翻动)

快捷键:

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


5.、less (一页一页翻动)

快捷键:

  • 空白键 :向下翻动一页;
  • [pagedown]:向下翻动一页;
  • [pageup] :向上翻动一页;
  • /字串 :向下搜寻‘字串’的功能;
  • ?字串 :向上搜寻‘字串’的功能;
  • n :重复前一个搜寻 (与 / 或 ? 有关!)
  • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
  • q :离开 less 这个程式;


5.5、head (取出前面几行)
语法:

  • head [-n number] 档案

选项与参数:

  • -n :后面接数字,代表显示几行的意思
  • 另外那个 -n 选项后面的参数较有趣,如果接的是负数,例如上面范例的-n -100时,代表列前的所有行数, 但不包括后面100行。  


5.6、tail (取出后面几行)
语法:

  • tail [-n number] 档案

选项与参数:

  • -n :后面接数字,代表显示几行的意思
  • -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测

范例一:如果不知道/etc/man.config有几行,却只想列出100行以后的资料时?
[root@www ~]# tail -n +100 /etc/man.config

/var/log/messages随时会有资料写入,你想要让该档案有资料写入时就立刻显示到荧幕上, 就利用 -f 这个选项,他可以一直侦测/var/log/messages这个档案,新加入的资料都会被显示到荧幕上。

 

5.7、od(非纯文字档)

语法:

  • 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 ;

读出的来数值预设是使用非文字档,亦即是 16 进位的数值来显示的

 

修改档案时间或建置新档: touch
我们在 ls 这个指令的介绍时,有稍微提到每个档案在linux底下都会记录许多的时间参数, 其实是有三个主要的变动时间,那么三个时间的意义是什么呢?

modification time (mtime):当该档案的‘内容资料’变更时,就会更新这个时间!内容资料指的是档案的内容,而不是档案的属性或权限喔!在预设的情况下,ls 显示出来的是该档案的 mtime

status time (ctime):当该档案的‘状态 (status)’改变时,就会更新这个时间,举例来说,像是权限与属性被更改了,都会更新这个时间啊。

access time (atime):当‘该档案的内容被取用’时,就会更新这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会更新该档案的 atime 了。

never包含mtime和ctime

语法:

  • touch [-acdmt] 档案

选项与参数:

  • -a :仅修订 access time;
  • -c :仅修改档案的时间,若该档案不存在则不建立新档案;
  • -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间"
  • -m :仅修改 mtime ;
  • -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]

复制一个档案时,复制所有的属性,但也没有办法复制 ctime 这个属性

touch 这个指令最常被使用的情况是:

建立一个空的档案;
将某个档案日期修订为目前 (mtime 与 atime)

 

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

6.1、umask(档案预设权限)

实例1:
[root@www ~]# umask

0022 <==与一般权限有关的是后面三个数字!
实例2:

[root@www ~]# umask -S
u=rwx,g=rx,o=rx

查阅的方式有两种,一种可以直接输入 umask ,就可以看到数字型态的权限设定分数, 一种则是加入 -S (Symbolic) 这个选项,就会以符号类型的方式来显示出权限了! 奇怪的是,怎么 umask 会有四组数字啊?不是只有三组吗?是没错啦。 第一组是特殊权限用的,我们先不要理他,所以先看后面三组即可。

预设的情况如下:

若使用者建立为‘档案’则预设‘没有可执行( x )权限’,亦即只有 rw 这两个项目,也就是最大为 666 分,预设权限如下:
-rw-rw-rw-

若使用者建立为‘目录’,则由于 x 与是否可以进入此目录有关,因此预设为所有权限均开放,亦即为 777 分,预设权限如下:
drwxrwxrwx

该预设值需要减掉的权限


例题:
假设你的 umask 为 003 ,请问该 umask 情况下,建立的档案与目录权限为?
答:
umask 为 003 ,所以拿掉的权限为 --------wx,因此:
档案: (-rw-rw-rw-) - (--------wx) = -rw-rw-r--
目录: (drwxrwxrwx) - (--------wx) = drwxrwxr--

如果使用预设属性相加减,则档案变成:666-003=663,亦即是 -rw-rw--wx ,这可是完全不对的喔!

 


6.2、chattr (设定档案隐藏属性)
语法:

  • chattr [+-=][ASacdistu] 档案或目录名称

选项与参数:

  • + :增加某一个特殊参数,其他原本存在参数则不动。
  • - :移除某一个特殊参数,其他原本存在参数则不动。
  • = :设定一定,且仅有后面接的参数
  • A :当设定了 A 这个属性时,若你有存取此档案(或目录)时,他的存取时间 atime将不会被修改,可避免I/O较慢的机器过度的存取磁碟。这对速度较慢的电脑有帮助
  • S :一般档案是非同步写入磁碟的(原理请参考第五章sync的说明),如果加上 S 这个属性时,当你进行任何档案的修改,该更动会‘同步’写入磁碟中。
  • a :当设定 a 之后,这个档案将只能增加资料,而不能删除也不能修改资料,只有root才能设定这个属性。
  • c :这个属性设定之后,将会自动的将此档案‘压缩’,在读取的时候将会自动解压缩,但是在储存的时候,将会先进行压缩后再储存(看来对于大档案似乎蛮有用的!)
  • d :当 dump 程序被执行的时候,设定 d 属性将可使该档案(或目录)不会被 dump 备份
  • i :这个 i 可就很厉害了!他可以让一个档案‘不能被删除、改名、设定连结也无法写入或新增资料!’对于系统安全性有相当大的助益!只有 root 能设定此属性
  • s :当档案设定了 s 属性时,如果这个档案被删除,他将会被完全的移除出这个硬碟空间,所以如果误删了,完全无法救回来了喔!
  • u :与 s 相反的,当使用 u 来设定档案时,如果该档案被删除了,则资料内容其实还存在磁碟中,可以使用来救援该档案喔!

注意:属性设定常见的是 a 与 i 的设定值,而且很多设定值必须要身为 root 才能设定


6.3、lsattr (显示档案隐藏属性)
语法:

  • lsattr [-adR] 档案或目录

选项与参数:

  • -a :将隐藏档的属性也秀出来;
  • -d :如果接的是目录,仅列出目录本身的属性而非目录内的档名;
  • -R :连同子目录的资料也一并列出来!

chattr指令只能在Ext2/Ext3的档案系统上面生效, 其他的档案系统可能就无法支援这个指令

 

6.4、文件的特殊权限:Set UID

当 s 这个标志出现在档案拥有者的 x 权限上时,此时就被称为 Set UID,简称为 SUID 的特殊权限。 那么SUID的权限对于一个档案的特殊功能是什么呢?基本上SUID有这样的限制与功能:

  • SUID 权限仅对二进位程式(binary program)有效。
  • SUID 仅可用在binary program 上, 不能够用在 shell script 上面!这是因为 shell script 只是将很多的 binary 执行档叫进来执行而已!所以 SUID 的权限部分,还是得要看 shell script 呼叫进来的程式的设定, 而不是 shell script 本身。
  • SUID 对于目录也是无效的
  • 执行者对于该程式需要具有 x 的可执行权限;
  • 本权限仅在执行该程式的过程中有效 (run-time);
  • 执行者将具有该程式拥有者 (owner) 的权限。

 

6.5、文件的特殊权限:Set GID

当 s 标志在档案拥有者的 x 项目为 SUID,那 s 在群组的 x 时则称为 Set GID, SGID 。

与 SUID 不同的是,SGID 可以针对档案或目录来设定!如果是对档案来说, SGID 有如下的功能:

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

SGID 也能够用在目录上,当一个目录设定了 SGID 的权限后,他将具有如下的功能:

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

6.6、文件的特殊权限:Sticky Bit

Sticky Bit, SBIT 目前只针对目录有效,对于档案已经没有效果了。 SBIT 对于目录的作用是:

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

换句话说:当甲这个使用者于 A 目录是具有群组或其他人的身份,并且拥有该目录 w 的权限, 这表示‘甲使用者对该目录内任何人建立的目录或档案均可进行 "删除/更名/搬移" 等动作。’ 不过,如果将 A 目录加上了 SBIT 的权限项目时, 则甲只能够针对自己建立的档案或目录进行删除/更名/移动等动作,而无法删除他人的档案。

 

SUID/SGID/SBIT 权限设定

如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

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

假设要将一个档案权限改为‘-rwsr-xr-x’时,由于 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:‘ chmod 4755 filename ’来设定!此外,还有大 S 与大 T 的产生喔!

S, T 代表的就是‘空的’啦!怎么说? SUID 是表示‘该档案在执行的时候,具有档案拥有者的权限’,但是档案 拥有者都无法执行了,哪里来的权限给其他人使用?当然就是空的啦!

而除了数字法之外,你也可以透过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,SBIT 则是 o+t。

看看如下的范例:

# 设定权限成为 -rws--x--x 的模样:
[root@www tmp]# chmod u=rwxs,go=x test; ls -l test

-rws--x--x 1 root root 0 Aug 18 23:47 test

# 承上,加上 SGID 与 SBIT 在上述的档案权限中!
[root@www tmp]# chmod g+s,o+t test; ls -l test
-rws--s--t 1 root root 0 Aug 18 23:47 test

 

6.7、file(观察文件类型)

知道某个档案的基本资料,例如是属于 ASCII 或者是 data 档案,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的资讯。

实例:

[root@www ~]# file ~/.bashrc
/root/.bashrc: ASCII text <==告诉我们是 ASCII 的纯文字档啊!
[root@www ~]# file /usr/bin/passwd
/usr/bin/passwd: setuid ELF 32-bit LSB executable, Intel 80386, version 1
(SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for
GNU/Linux 2.6.9, stripped

# 执行档的资料可就多的不得了!包括这个档案的 suid 权限、相容于 Intel 386
# 等级的硬体平台、使用的是 Linux 核心 2.6.9 的动态函式库连结等等。
[root@www ~]# file /var/lib/mlocate/mlocate.db
/var/lib/mlocate/mlocate.db: data <== 这是 data 档案!

 

七、命令与文件的查询

在终端机模式当中,连续输入两次[tab]按键就能够知道使用者有多少指令可以下达。 

7.1、which (寻找‘执行档’)

语法:

  • which [-a] command

选项或参数:

  • -a :将所有由 PATH 目录中可以找到的指令均列出,而不止第一个被找到的指令名称

 

再来谈一谈怎么搜寻档案吧!在 Linux 底下也有相当优异的搜寻指令呦!通常 find 不很常用的!因为速度慢之外, 也很操硬碟!通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻呦! 为什么呢?因为 whereis 与 locate 是利用资料库来搜寻资料,所以相当的快速,而且并没有实际的搜寻硬碟, 比较省时间啦!

7.2、whereis (寻找特定档案)

语法:

  • [root@www ~]# whereis [-bmsu] 档案或目录名

选项与参数:

  • -b :只找 binary 格式的档案
  • -m :只找在说明档 manual 路径下的档案
  • -s :只找 source 来源档案
  • -u :搜寻不在上述三个项目当中的其他特殊档案

 

7.3、locate
语法:

  • [root@www ~]# locate [-ir] keyword

选项与参数:

  • -i :忽略大小写的差异;
  • -r :后面可接正规表示法的显示方式

那能否手动更新资料库哪?当然可以啊!更新 locate 资料库的方法非常简单,直接输入‘ updatedb ’就可以了! updatedb 指令会去读取 /etc/updatedb.conf 这个设定档的设定,然后再去硬碟里面进行搜寻档名的动作, 最后就更新整个资料库档案啰!因为 updatedb 会去搜寻硬碟,所以当你执行 updatedb 时,可能会等待数分钟的时间喔!

  • updatedb:根据 /etc/updatedb.conf 的设定去搜寻系统硬碟内的档名,并更新 /var/lib/mlocate 内的资料库档案;
  • locate:依据 /var/lib/mlocate 内的资料库记载,找出使用者输入的关键字档名。

 

7.4、find
语法:

  • 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 还要新的档案档名

 

图中最右边为目前的时间,越往左边则代表越早之前的时间轴:

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

 

选项与参数:
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.... 的属性存在!

 

find 后面可以接多个目录来进行搜寻!另外, find 本来就会搜寻次目录,这个特色也要特别注意。

选项与参数:
4. 额外可进行的动作:

  • -exec command :command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。
  • -print :将结果列印到荧幕上,这个动作是预设动作!

  • {} 代表的是‘由 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 的权限