目录
第六章:Linux文件与目录管理
6.1 目录与路径
1.相对目录与绝对路径
2.目录的相关操作
3.关于执行文件路径的变量:$PATH
6.2 文件与目录管理
1.文件与目录的查看:ls
2.复制、删除与移动:cp、rm、mv
3.获取路径的文件名与目录名称
6.3 文件内容查看
1.直接查看文件内容
2.可翻页查看
3.数据截取
4.非纯文本文件:od
5.修改文件时间或创建新文件:touch
6.4 文件与目录的默认权限与隐藏权限
1.文件默认权限:umask
2.文件隐藏属性
3.文件特殊权限:SUID、SGID、SBIT
4.观察文件类型:file
6.5 命令与文件的查找
1.脚本文件的查找
2.文件的查找
6.6 极重要的复习,权限与命令间的关系
Linux 系统中所有的文件(目录)都被组织成以根目录“/”开始的倒置的树状结构
绝对路径一定是由根目录 / 开始写起。例如,使用绝对路径的表示方式指明 bin 文件所在的位置,该路径应写为 ../bin
可以看到,如果仅传递给 Linux 系统一个文件名,它无法找到指定文件;而当将 bin 文件的绝对路径传递 Linux 系统时,它就可以成功找到。
和绝对路径不同,相对路径不是从根目录 / 开始写起,而是从当前所在的工作目录开始写起。使用相对路径表明某文件的存储位置时,经常会用到前面讲到的 2 个特殊目录,即当前目录(用 . 表示)和父目录(用 .. 表示)。
举个例子,当我们使用 root 身份登录 Linux 系统时,当前工作目录默认为 /root,如果此时需要将当前工作目录调整到 root 的子目录 Desktop 中,当然可以使用绝对路径。
对于文件名的正确性来说,绝对路径的正确度要比较好。
常用的特殊目录
. 当前目录 .. 上一层目录 - 前一个工作目录 ~ 当前【用户】所在的家目录
注意:在根目录下查询目录结构,可以发现存在 . 与.. 两个目录,但可以发现两个目录的属性权限完全一致,代表根目录的上级目录与自身是同一个目录。
常见的处理目录的命令:
- cd:切换目录
- pwd:显示当前目录
- mkdir:建立一个新目录
- rmdir:删除一个空目录
cd(change directory,切换目录)
cd- 表示切换到刚才的目录。
pwd(显示目前所在的目录)
pwd单独使用时显示出实际的工作目录,而非链接文本本身的目录名而已;
pwd -P 时,不会显示链接文件的路径,而是显示正确的完整路径。
mkdir(建立新目录)
命令格式: mkdir [-mp] 目录名称
选项与参数:
-m:设置文件的权限,直接设置,不使用默认权限(umask)
-p:帮助你直接将所需要的目录(包含上层目录)递归创建
范例1:利用-p递归建立目录(没有加 -p 时会报告路径错误)
范例2:设置新建目录权限
若没有加上 -m 强制设置属性,系统会使用默认属性。
rmdir(删除“空”的目录)
有内容的文件夹无法直接删除,如果需要全部删除目录下文件必须使用【rm -r test】
执行【echo $PATH】可以看到哪些
PATH这个变量的内容是由一堆目录所组成,每个目录中间用冒号(:)来隔开,每个目录有顺序之分。
选项 | 功能 |
---|---|
-a | 显示全部的文件,包括隐藏文件(开头为 . 的文件)也一起罗列出来,这是最常用的选项之一。 |
-A | 显示全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录。 |
-d | 仅列出目录本身,而不是列出目录内的文件数据。 |
-f | ls 默认会以文件名排序,使用 -f 选项会直接列出结果,而不进行排序。 |
-F | 在文件或目录名后加上文件类型的指示符号,例如,* 代表可运行文件,/ 代表目录,= 代表 socket 文件,| 代表 FIFO 文件。 |
-h | 以人们易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等。 |
-i | 显示 inode 节点信息。 |
-l | 使用长格式列出文件和目录信息。 |
-n | 以 UID 和 GID 分别代替文件用户名和群组名显示出来。 |
-r | 将排序结果反向输出,比如,若原本文件名由小到大,反向则为由大到小。 |
-R | 连同子目录内容一起列出来,等於将该目录下的所有文件都显示出来。 |
-S | 以文件容量大小排序,而不是以文件名排序。 |
-t | 以时间排序,而不是以文件名排序。 |
--color=never --color=always --color=auto |
never 表示不依据文件特性给予颜色显示。 always 表示显示颜色,ls 默认采用这种方式。 auto 表示让系统自行依据配置来判断是否给予颜色。 |
--full-time | 以完整时间模式 (包含年、月、日、时、分)输出 |
--time={atime,ctime} | 输出 access 时间或改变权限属性时间(ctime),而不是内容变更时间。 |
cp(复制文件或目录)
命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [option] source1 source2 source3 … directory
参数说明:
- -a:是指archive的意思,也说是指复制所有的目录
- -d:若源文件为连接文件(link file),则复制连接文件属性而非文件本身
- -f:强制(force),若有重复或其它疑问时,不会询问用户,而强制复制
- -i:若目标文件(destination)已存在,在覆盖时会先询问是否真的操作
- -l:建立硬连接(hard link)的连接文件,而非复制文件本身
- -p:与文件的属性一起复制,而非使用默认属性
- -r:递归复制,用于目录的复制操作
- -s:复制成符号连接文件(symbolic link),即“快捷方式”文件
- -u:若目标文件比源文件旧,更新目标文件
如将/test1目录下的file1复制到/test3目录,并将文件名改为file2,可输入以下命令:
cp /test1/file1 /test3/file2
在默认的条件中,cp的源文件与目标文件的权限是不同的,目标文件的拥有者通常会是命令操作者本身。
注:使用 -l 及 -s 都会建立所谓的链接文件(link file),但是这两种链接文件却有不一样的情况。
-l 是硬链接(hard link),-s 是符号链接(symbolic link),简单来说,bashrc_link 是一个快捷方式,这个快捷方式会链接到bashrc;
而 bashrc_slink 的文件与 bashrc 的属性与权限完全一模一样。
例:用neos的身份将/var/log/wtmp 文件复制到 /tmp 下面,并更名为 neos_wtmp
可以看到neos的身份不能随意修改文件的拥有者与用户组,虽然能复制wtmp的相关权限与时间等属性,但是与拥有者、用户组相关,即使加上-a 也无法完成完整权限的复制。
rm(删除文件或目录)
用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。
rm命令的一般形式为:rm [选项]... 目录... 删除指定的<文件>(即解除链接)。
- -d --directory 删除可能仍有数据的目录 (只限超级用户)
- -f --force 略过不存在的文件,不显示任何信息,强制删除
- -i --interactive 进行任何删除操作前必须先确认
- -r/R --recursive 同时删除该目录下的所有目录层
- -v --verbose 详细显示进行的步骤
mv(移动文件与目录,或重命名)
- -b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
- -i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入 y 表示直接覆盖,输入 n 表示取消该操作。
- -f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
- -n: 不要覆盖任何已存在的文件或目录。
- -u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
将多个文件移动到一个目录下,则最后一个参数为指定目录。
前者获取最后的文件名;后者取得目录名。
直接查看文件内容可以使用 cat/tac/nl 几个命令。
cat(concatenate)
命令格式:cat [-AbeEnstTuv] [--help] [--version] fileName
cat也可以用于创建文件、合并文件。
- -n 或 --number:由 1 开始对所有输出的行数编号。
- -b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
- -s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
- -v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
- -E 或 --show-ends : 在每行结束处显示 $。
- -T 或 --show-tabs: 将 TAB 字符显示为 ^I。
- -A, --show-all:等价于 -vET。
- -e:等价于"-vE"选项;
- -t:等价于"-vT"选项;
tac
tac 与 cat 相反,相当于将命令反写打印出来。
nl(添加行号打印)
选项与参数: -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
less的用法比起more更有弹性,在more的时候,我们并没有办法向前面翻,只能往后面看,但若使用了less时,就可以使用 [pageup]、[pagedown] 等按键的功能来往前往后翻看文件。
less里面可以拥有更多的查找功能。不止可以向下查找,也可以向上查找,基本命令有:
空白键 :向下翻动一页;
[pagedown]:向下翻动一页;
[pageup] :向上翻动一页;
/字串 :向下搜寻『字串』的功能;
?字串 :向上搜寻『字串』的功能;
n :重复前一个搜寻 (与 / 或 ? 有关!)
N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
q :离开 less 这个程序;
我们可以将输出的数据作一个简单的截取,那就是取出文件前面几行(head)或取出后面几行(tail)文字的功能。不过要注意的是head与tail都是以“行”为单位来进行数据截取的。
head
[root@www ~]# head [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 [root@www ~]# head /etc/man.config # 默认的情况中,显示前面十行!若要显示前 20 行,就得要这样: [root@www ~]# head -n 20 /etc/man.config 范例:如果后面100行的数据都不列印,只列印/etc/man.config的前面几行,该如何是好?
tail
[root@www ~]# tail [-n number] 文件 选项与参数: -n :后面接数字,代表显示几行的意思 -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测 [root@www ~]# tail /etc/man.config # 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样: [root@www ~]# tail -n 20 /etc/man.config 范例一:如果不知道/etc/man.config有几行,却只想列出100行以后的数据时? [root@www ~]# tail -n +100 /etc/man.config 范例二:持续侦测/var/log/messages的内容 <==要等到输入[crtl]-c之后才会离开tail这个命令的侦测!
上面的都是查看纯文本文件的内容。如果想要查看非文本文件,举例 说/user/bin/passwd 这个执行文件的内容时,又该如何读出信息呢?
事实上由于执行文件通常都是二进制文件(binary file),使用以上命令读取内容时会产生类似乱码的数据。所以我们可以利用od这个命令来读取。
选项或参数: -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 ;
将/etc/issue这个文件的内容以8进位列出储存值与ASCII的对照表
选项与参数: -a :仅修订 access time; -c :仅修改文件的时间,若该文件不存在则不创建新文件; -d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date="日期或时间" -m :仅修改 mtime ; -t :后面可以接欲修订的时间而不用目前的时间,格式为[YYMMDDhhmm]
修改时间 modification time (mtime):
当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!
状态时间 status time (ctime):
当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。
读取时间 access time (atime):
当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。
默认情况下,ls 显示出来的是文件的mtime,也就是该文件的内容上次被修改的时间。
例1:新建一个空白文件观察时间;
例2:将~/.bashrc 复制成为bashrc,假设复制完整的属性,检查其日期。
可以观察例2的输出:
1.当前时间
2.mtime
3.atime
4.ctime
例3:修改例2的 bashrc 文件时间,将其调整为两天前。
可以看到日期从11月16日变为了11月14日。
例4:将上个例子的bashrc日期改为 2014/06/15 2:02。
前面已经了解了文件有若干个属性,包括读写执行(r、w、x)等基本权限以及是否为目录(d)与文件(-)或者链接文件(l)等属性。
除了基本权限外,在Linux传统的额ext2、ext3、ext4文件系统下,我们还可以设置其他的系统隐藏属性,这部分可以使用 chattr 来设置,而以 lsattr 来查看,最重要的属性就是可以设置其不可修改的特性,让文件的拥有者都不可以进行修改。这在安全功能上非常重要。
例:你的系统中有一个一般用户 neos,他的用户组属于 neos,他的根目录在 /home/neos,你是root,你想将你的~/.bashrc 复制给它,可以怎么做?
如下:
例:我想在/tmp下面建立一个目录,这个目录名称为诶chapter6_1,并且这个目录拥有者为neos,用户组为 neos,此外,任何人都可以进入该目录浏览文件,不过除了neos之外,其他人都不能修改该目录下的文件。
现在我们已经知道如何建立或是改变一个目录或文件的属性了,但当你建立一个新的文件或目录时,它的默认权限就和umask有关了。umask就是制定目前用户在建立文件或目录时候的权限默认值,它的指定条件以下面的方式来指定:
直接输入umask可以看到数字类型的权限设置值;加入-S(Symbolic)这个选项,就会以符号类型的方式来显示出权限。
其中四组数字中,第一组是特殊权限使用的。
在默认权限的属性上,目录与文件是不一样的。
-rw-rw-rw-
drwxrwxrwx
要注意的是,umask 的数字指的是该默认值需要减掉的权限。
因为umask的默认值为022,所以user并没有被拿掉任何权限,但group与others的权限被拿掉了2(也就是w这个权限),那么当游湖:
但如果要使创建的额文件能够让同组用户共同编辑,那么umask的用户组就不能拿掉2这个w的权限,所以usmask应该设置为002才可以。要改变umask的值,只需直接在umask后面输入002就好。
文件隐藏属性在系统安全上非常重要。但是下面的chattr命令只能在ext2、ext3、ext4的Linux传统文件系统上面完整生效,其他的文件系统可能就无法完整地支持这个命令了。
chattr命令的用法:chattr [ -RVf ] [ -v version ] [ mode ] files…
最关键的是在[mode]部分,[mode]部分是由+-=和[ASacDdIijsTtu]这些字符组合的,这部分是用来控制文件的
属性。
+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。
A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S(同步):硬盘I/O同步选项,功能类似sync。
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文件安全,只有root才能设定这个属性。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件 系统的安全设置有很大帮助。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂 载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。
s(secret):保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion。
各参数选项中常用到的是a和i。a选项强制只可添加不可删除,多用于日志系统的安全设定。而i是更为严格的安全设定,只有superuser (root) 或具有CAP_LINUX_IMMUTABLE处理能力(标识)的进程能够施加该选项。
以下示例为建立一个空文件给它加上隐藏属性->无法被删除,可以看到即使是root也无法将其删除,需要先将这个隐藏属性去除才能执行。
这些隐藏属性中,最重要的当属+i与+a。+i可以让一个文件无法被修改,对系统安全十分重要;+a可以针对logfile这样的日志文件设置可以增加但不能修改旧数据与删除的属性。
lsattr命令的用法:lsattr [-adlRvV][文件或目录...]
- -a 显示所有文件和目录,包括以"."为名称开头字符的额外内建,现行目录"."与上层目录".."。
- -d 显示,目录名称,而非其内容。
- -l 此参数目前没有任何作用。
- -R 递归处理,将指定目录下的所有文件及子目录一并处理。
- -v 显示文件或目录版本。
- -V 显示版本信息。
当我们查看/tmp、bin/passwd目录的权限时可以发现,除了通常的三大权限rwx以外,居然还有别的特殊权限(s、t)存在。
s与t这两个权限的意义与系统的账号及系统的进程管理较为相关。
s在之中称为SUID与SGID。
当s这个标志出现在文件拥有者的x权限上时,例如刚刚的/bin/passwd文件的权限状态【-rwsr-xr-x】,此时就被称为Set UID,简称为SUID的特殊权限。基本上SUID有这样的限制与功能:
- SUID权限仅对二进制程序有效;
- 执行者对于该程序需要具有x的可执行权限;
- 本权限仅在执行程序的过程中有效(run-time);
- 执行者将具有该程序拥有者(owner)的权限。
打个比方,系统中所有账号的密码都记录在/etc/shadow这个文件当中,这个文件的权限为【----------1 root root】,表示这个文件仅有root可读且有root可以强制写入而已。但一般用户虽然没有读写权限,却依然可以更改自己的密码。因为这是SUID的功能。由此可知:
注:这个SUID只能运行在二进制的程序上(系统中的一些命令),不能用在shell脚本上(script),因为脚本还是把很多的程序集合到一起来执行,而不是脚本自身在执行。同样,这个SUID也不能放到目录上,放上也是无效的。
当s标志在文件拥有者的x项为SUID,那s在用户组的x时则称为Set GID(SGID),举例来说,可以用下面的命令来观察到具有SGID权限的文件:
与SUID不同的是,SGID可以针对文件或目录来设置。如果是文件,SGID有如下功能:
- SGID对二进制程序有用;
- 程序执行者对于该程序来说,需具备x的权限;
- 执行者在执行的过程中将会获得该程序用户组的支持。
举例说上面的/bin/locate这个程序可以去查找/var/lib/mlocate/mlocate.db这个文件的内容,mlocate.db的权限如下:
与SUID类似,如果使用用户neos这个账号执行locate时,那neos将会祛痘的slocate用户组的支持,因此就能读取mlocate.db
除了二进制程序外,SGID也能够用在目录中,这也是非常常见的用途。当一个目录设置了SGID的权限后,将具有如下的功能:
- 用户若对于此目录具有r与x的权限时,该用户能够进入此用户;
- 用户在此目录下的有效用户组(effective group)将会变成该目录的用户组;
- 用途:若用户在此目录下具有w的权限(可以新建文件),则该用户建立的新文件,该新文件的用户组与此目录的用户组相同。
这个Sticky Bit(SBIT)目前只针对目录有效,对于文件已经没有效果了。作用是:
- 当用户对于此目录具有w、x权限,即具有写入的权限;
- 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。
使只有文件或者目录的所有者才能删除文件或者目录。
可以用如下的范例解释:
本身/tmp具有的权限是【drwxrwxrwt】,这样任何人都可以在/tmp内新增、修改文件,但仅有该文件/目录建立者与root能够删除自己的目录或文件。
可以用数字或字母方法:
4 为 SUID = u+s
2 为 SGID = g+s
1 为 SBIT = o+t
假设要将一个文件权限改为【-rwsr-xr-x】时,由于s在用户权限中,所以是SUID,因此,在原先的755之前还要加上4,也就是【chmod 4755 filename】。
范例:
(最后一个例子出现的大写S和T,代表的是空权限。因为SUID是表示该文件在执行的时候具有文件拥有者的权限,但是文件的拥有者都无法执行了,权限就变成空的了。)
注:必须了解SUID不是用在目录上,SBIT不是用在文件上。
如果想要知道某个文件的基本信息,例如是属于ASCII或是数据文件或是二进制文件,且其中有没有使用到动态链接库(share library)等信息,就可以使用file来查看:
在命令行模式中,连续输入两次【tab】按键就能知道用户有多少命令可以执行。这些命令的完整文件名存放的位置可以通过which或者type来查找。
语法:which [文件...]
-n<文件名长度> 指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名。
-p<文件名长度> 与-n参数相同,但此处的<文件名长度>包括了文件的路径。
-w 指定输出时栏位的宽度。
-V 显示版本信息。
这里看到居然找不到history命令的路径。其实这个命令是根据【PATH】这个环境变量所规范的路径,去查找执行文件的文件名。因为history是bash内置的命令。但是which默认是找PATH内所设置的目录。所以我们可以使用type这个命令。
通常find不很常用(速度慢,影响硬盘性能)。
一般都是先使用whereis或是locate来检查,最后如果没有结果再使用find。
语法:whereis [-bfmsu][-B <目录>...][-M <目录>...][-S <目录>...][文件...]
- -b 只查找二进制文件。
- -B<目录> 只在设置的目录下查找二进制文件。
- -f 不显示文件名前的路径名称。
- -m 只查找说明文件。
- -M<目录> 只在设置的目录下查找说明文件。
- -s 只查找原始代码文件。
- -S<目录> 只在设置的目录下查找原始代码文件。
- -u 查找不包含指定类型的文件。
例1:找出ifconfig这个文件名。
例2:只找出跟passwd有关的【说明文件】文件名(man page)
全部列出:
只有在man里面的文件名才显示:
语法:locate [-d ][--help][--version][范本样式...]
- -b, --basename -- 仅匹配路径名的基本名称
- -c, --count -- 只输出找到的数量
- -d, --database DBPATH -- 使用 DBPATH 指定的数据库,而不是默认数据库 /var/lib/mlocate/mlocate.db
- -e, --existing -- 仅打印当前现有文件的条目
- -1 -- 如果 是 1.则启动安全模式。在安全模式下,使用者不会看到权限无法看到 的档案。这会始速度减慢,因为 locate 必须至实际的档案系统中取得档案的 权限资料。
- -0, --null -- 在输出上带有NUL的单独条目
- -S, --statistics -- 不搜索条目,打印有关每个数据库的统计信息
- -q -- 安静模式,不会显示任何错误讯息。
- -P, --nofollow, -H -- 检查文件存在时不要遵循尾随的符号链接
- -l, --limit, -n LIMIT -- 将输出(或计数)限制为LIMIT个条目
- -n -- 至多显示 n个输出。
- -m, --mmap -- 被忽略,为了向后兼容
- -r, --regexp REGEXP -- 使用基本正则表达式
- --regex -- 使用扩展正则表达式
- -q, --quiet -- 安静模式,不会显示任何错误讯息
- -s, --stdio -- 被忽略,为了向后兼容
- -o -- 指定资料库存的名称。
- -h, --help -- 显示帮助
- -i, --ignore-case -- 忽略大小写
- -V, --version -- 显示版本信息
例1:找出系统中所有与passwd相关的文件名,且只列出5个。
例2:列出locate查询所使用的数据库文件之文件名与各数据的数量。
locate直接在后面输入文件的部分名称后就能得到结果。
但是locate有使用上的限制,因为locate寻找的数据是由已建立的数据库 /var/lib/mlocate/ 里面的数据查找到的。但正因为它是由数据库来查找的,而数据库的建立默认是在每天执行一次(CentOS 7.x是每天更新一次数据库)。
要手动更新数据库直接输入【updatedb】。
语法:find path -option [ -print ] [ -exec -ok command ] {} \;
1.与时间有关的选项:共有-atime、-ctime、-mtime。
- -mtime n:n为数字,意义为在n天之前的【一天之内】被修改过内容的文件;
- -mtime +n
- -mtime -n
- -newer file:file为一个存在的文件,列出比file还要新的文件。
例1:将过去系统上面24小时内有修改过内容(mtime)的文件列出:
#0代表目前的时间。所以从现在开始到24小时前有变动过内容的额文件都会被显示。
#如果是三天前那一天的24小时内,就用 find / -mtime 3
例2:寻找 /etc 下面的文件,如果文件日期比 /etc/passwd 新就列出
例1中列出了按时间参数来查找文件的范例。如果要找出4天内被修改过的文件,那可以使用【find /var -mtime -4】,如果是4天前的那一天就使用【find /var -mtime 4】。
2.与使用者或用户组名称有关的参数:
- -uid n:n为数字,这个数字是使用者的账号ID,即UID,这个UID是记录在 /etc/passwd 里面与账号名称对应的数字
- -user name:name为使用者账号名称,例如neos
- -group name:name为用户组名称,例如users
- -nouser:查找文件的拥有者不在 /etc/passwd 中
- -nogroup:查找文件的拥有用户组不存在于 /etc/group 中
例3:查找home下面属于neos的文件
例4:查找系统中不属于任何人的文件
可以找出不正常的文件,或是曾经以源代码自行编译软件时的文件。
3.与文件权限及名称有关的参数:
- -name filename:查找文件名称为filename的文件
- -size [+ -] SIZE:查找比SIZE还要大(+)或小(-)的文件,这个SIZE的规格有:c代表Bytes,k代表1024Bytes
- -type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f),设备文件(b,c),目录(d),链接文件(l),socket(s),及FIFO(p)等属性。
- -perm mode:精确匹配mode所表示的条件;
- -perm /mode:任何一类用户(ugo)的权限中的任何一位(rwx)符合mode所表示的条件即可,9位权限之间存在“或”关系;
- -perm -mode:任何一类用户(ugo)的权限中的每一位(rwx)都要同时符合mode所表示的条件,9位权限之间存在“与”关系;
例5:查找文件名,关键字可用*处理
例5-1:找出文件名包含了passwd这个关键字的文件
例6:找出/run目录下,文件类型为socket的文件名有哪些?
例7:查找文件当中含有SGID,SUID或SBIT的属性。
find的特殊功能:
- -exec command:command为其他命令,-exec后面可再接额外的命令来处理查找到的结果。
- -print:将结果打印到屏幕上,这是默认操作
例8:将例7中找到的文件使用ls -l列出来。
# -exec后面的ls -l就是额外的命令,命令不支持命令别名
#所以仅能使用ls -l不可以使用ll
- {}代表的是由find找到的内容,如例8所示,find的结果会被放置到{}位置中;
- -exec一直到 \;是关键词,代表find额外操作的开始(-exec)到结束(\;),在这中间的就是find命令内的额外操作。在本例中就是【ls -l {}】;
- 因为【;】在bash环境下是有特殊意义的,因此利用反斜杠来转义。
例9:找出系统中大于8MB的文件。
fnd还可以用通配符来查找文件名。
一、让用户能进入某目录成为可工作目录的基本权限是什么?
二、用户在某个目录内读取一个文件的基本权限是什么?
三、让用户可以修改一个文件的基本权限是什么?
四、让一个用户可以建立一个文件的基本权限是什么?
五、让用户进入某目录并执行该目录下的某个命令之基本权限是什么?