目录导读
- 目录与路径
- 文件与目录管理
- 文件内容查阅
- 文件与目录的默认权限与隐藏权限
- 命令与文件的查询
- 权限与命令间的关系
前面讲解的是文件和目录的权限及目录的配置,这节讲解如何操作与管理文件和目录。
1.目录与路径
(1)相对路径与绝对路径
绝对路径: 写法由根目录(/)开始写起
注意:对于文件名的正确性来说,绝对路径的正确度要比较好。尤其是在写shell scripts来管理系统的条件下,写相对路径容易因为系统环境不同而出错。
相对路径路径: 不是由根目录(/)写起, 相对路径具有更多的灵活性
(2)目录的相关操作
1.特殊的目录:
. 代表次层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表目前用户身份所在的主文件夹,如root的为/root, ql2012jz的主文件夹为:/home/ql2012jz
~account 代表account这个用户的主文件夹
注:
1.在所有的目录下都会存在".", ".."这两个目录
2.根目录中也存在".",".."这两个目录,执行'ls -al /'命令后发现,这两个目录的属性和权限完全一样。因此,得知在根目录下这两个目录是同一个目录。
2.常见的处理目录的命令:
cd 切换目录
pwd 显示当前目录
mkdir 新建一个新的目录
rmdir 删除一个空的目录(不是空的不能删除吗?对)
(1)cd (切换目录): Change Directoty
几个例子:
>> cd ~ql2012jz #表示去ql2012jz这个用户的主文件夹,即/home/ql2012jz
>> cd ~ #表示回到自己的主文件夹
>> cd #也是表示回到自己的主文件夹
>> cd - #表示回到刚才的那个目录,即前一次所在的目录
>> cd /var/spool/mail #绝对路径的写法,直接去这个文件夹
>> cd ../mqueue #相对路径的写法,去/var/spool/mqueue文件夹
(2)pwd(显示目前所在的目录):Print Working Directory
>> pwd [-p]
参数:
-p : 显示出当前的工作目录
例如:
>> pwd #仅仅单纯的显示当前的工作目录
>> pwd -p #对于如连接文件,它才显示真正的工作目录
(3)mkdir(新建目录)
>> mkdir [-mp] 目录名称
参数:
-m : 配置文件案的权限,直接设置,不用看默认权限
-p :直接将所需的目录(即原本不存在的目录,包含上层的目录)都会递归创建出来
例如:
>> mkdir test1/test2 #在没有test1的情况下是不能直接创建test2的
>> mkdir -p test1/test2 #即使没有test1,还是能创建test1和test2
>> mkdir -m 711 test1 #创建目录test1, 权限:drwx--w--w
(4)rmdir(删除目录)
>> rmdir [-p] 目录名称
参数:
-p : 连通上层“空的”目录也一起删除
注意:这个参数只能删除一系列空的目录,但凡子目录中有文件存在就不能删除
扩展:如果想将目录下的所有东西都删除的话,包含有非空的目录,可以使用 rm -r DirectoryName
(3)关于执行文件路径变量:$PATH (也称为环境变量)
ls命令的完整路径:/bin/ls
但我们却可以在任何路径下执行这个命令,原因在于有环境变量的帮助,
>> echo $PATH #PATH须大写
>>/usr/kerberos/sbin:/sur/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:'/bin':/usr/sbin:/usr/bin:/root/bin
注:PATH变量的值是由一些列目录路径组成,每个目录之间以冒号(:)来隔开。这个不同于windows下的以分号(;)隔开无论是普通用户还是root用户,PATH中都有/bin这个目录,因此,我们在任何地方都可以执行ls命令
如果某个命令没有加入PATH变量的路径,是无法直接用命令名执行的(即使当前工作环境在该命令所在的目录下也不行,因为没有把当前目录(.)加入PATH中。Windows中把(.)加入PATH中),需要使用命令的绝对路径来执行
如:>> /bin/ls -al
注:移动某个文件
>> mv /bin/ls /root #将/bin下的ls文件移动到/root下
如何将某个目录加入到执行文件查询目录(环境变量)PATH变量中?
[root@localhost ~]# PATH="$PATH":/root
注意:这种设置方式会在注销root账户后失效,还的重新配置
同样名称的路径在不同的目录中,对于PATH变量中,哪个目录在前就先执行它
如:ls命令,在/usr/local/bins/ls 和 /bin/ls下,在PATH的值中哪个在前就先执行谁
为什么不像Windows中那样将当前目录(.)加入PATH中?
1.由于在Linux中工作目录并不固定,因此能够执行的命令也会变动(因为每个目录下面的可执行文件都不相同)
2.容易造成安全隐患,别的普通用户可以在公共目录下伪造命令,让其他用户尤其是root用户被窃取数据等安全隐患
3.因此,为了安全,不建议将"."加入到PATH查询目录中
注意:
1.不同用户默认的PATH不同,因此默认能够随意执行的命令也不相同
2.PATH是可以修改的,因此,一般用户还是可以通过修改PATH来执行某些位于/sbin或/usr/sbin下的命令
3.使用绝对路径或相对路径直接执行某个命令比查询PATH来的正确(因为有时会存在同名的命令,而且通过PATH查询得到的那个命令(在前面的先执行)不一定是我们想要执行的命令)
4.命令应该放置到正确的目录下,执行才会比较方便
5.当前目录(.)最好不要放到PATH当中
2.文件与目录管理
ls #查看文件与目录
cp #复制
rm #删除
mv #移动
(1)查看文件与目录: ls
>> ls [-option]
参数:
-l : 列出长数据串,包含文件的属性与权限等数据
-a : 全部的文件,连通隐藏文件
-d : 仅列出目录本身,而不是列出目录内的文件数据
-s : 以文件容量大小进行排序显示,而不是文件名排序
-i : 列出inode号码
(2)复制: cp
>> cp [-option]
参数(认真看这些参数的解释):
-a : 相当于pdr的意思(就是全部包括属性、权限都复制吗?)
-i : 若目标文件已经存在时,在覆盖时会先询问操作的进行
-r : 递归复制,用于目录的复制行为
-p : 连同文件的属性一起复制过去,而非使用默认属性(备份常用)
-s : 复制成为符号链接文件(Symbolic link),即"快捷方式"文件,俗称软连接
-l : 进行硬连接(hard link)的连接文件创建,而非复制文件本身
-u : 若目标文件(destination, 将要被覆盖的文件)比源文件(source)旧才更新目标文件,多用于"备份"的情况
-d : 若源文件为连接文件的属性(link file),则复制连接文件属性而非文件本身(即只是复制了这个链接而已,链接正真指向的文件并没有进行复制)
注意:这里如果没有使用 -d 参数的话,实际复制的是该连接所指向的真正的文件
例如:
[root@loaclhost ~] cp ~/.bashrc /tmp/bashrc0 #将主文件夹下的.bashrc复制到/tmp下,并更名文件为bashrc0
注意:1.cp这个命令在不同的身份用户下执行命令有时会不一样,尤其是对于-a,-p参数
2.(重要)在不加任何参数的情况在,复制操作会改变文件的某些属性/权限,如果想将文件的所有特性一起复制过来就需要加上-a
3.在默认的情况下,cp的源文件与目的文件的权限是不同的,且目的文件的所有者通常会是命令操作者本身(即当前用户)。
4.在复制文件时格外注意文件权限变化的问题,尤其是像备份的情况,必须使用-a或-p等完整复制文件权限的参数才行
5.支持同时将多个文件一次性复制到同一个目录中。>> cp ~/.bashrc ./aa /tmp # 将.bashrc和当前目录下的aa复制到/tmp文件下
6.普通身份进行完整复制时,尽管文件的相关属性和权限都能复制,但是与所有者、用户组相关的,原本该普通用户身份无法进行的操作,即使加上-a也是无法达到完整复制权限
言而总之
是否需要完整保留源文件的信息
源文件是否为软连接文件(Symboloic link file)
源文件是否为特殊文件,如FIFO,socket
源文件是否为目录
(3)移除文件或目录:rm
>> rm [-option] 文件或目录
参数:
-f : 强制删除文件,忽略不存在的文件,不会出现警告信息
-i : 互动模式,即在删除前询问用户是否操作。(默认是这种方式)
-r : 递归删除,最常用的在目录的删除了,这个操作要小心,容易造成误操作
注意:
1.加上-r参数删除目录时,有的目录内的文件特别多,需要一直不停的确认是否删除,为了不让系统询问直接删除,采用命令:\rm -r /tmp/etc
2.在命令前加"\"可以忽略掉alias的指定参数
3.注意删除"-aaa"名称的文件,系统会误认为-aaa是个参数的。
删除方法:>> rm ./-aaa
>> rm -- -aaa
通常还是应该避免以-开头的命名
(4)移动文件与目录,或更名:mv
>> mv [-option]
参数:
-f : force,强制的意思,如果目标文件已经存在,不会询问,直接覆盖的
-i : 若目标文件已经存在,就会询问收否覆盖
-u : 若目标文件已经存在,且source比较新,才会更新
例如:
>> mv .bashrc mvtest # 将.bashrc移到mvtest中
>> mv mvtest mvtest01 # 将mvtest文件夹重命名
注:其实在Linux下还有一个rename命令,专门进行'多个'文件名的同时重命名,并非针对单一文件名的更改
>> mv .bashrc1 .bashrc2 mvtest01 #将.bashrc1和.bashrc2同时移动到mvtest01目录中。
注意:
可以使用-u来测试新旧文件,看看是否需要移动。
另一个途径就是"更改文件名"
(5)取得路径的文件名与目录名称
用于在写程序时,判断当前完整的文件名是代表文件还是目录?人工可以通过(/)来分辨
在Shell部分详讲
3.文件内容查阅
cat # 由第一行开始显示文件内容
tac # 从最后一行开始显示,与cat是倒写的形式,在显示上也是
nl # 显示的时候,顺便输出行号
more # 一页一页的显示文件内容
less # 与more类似,但是比more更好的是它可以往前翻页
head # 只看头几行
tail # 只看结尾几行
od # 以二进制的形式读取文件内容,用于显示非纯文本的文件
(1)直接查看文件内容: cat, tac, nl
>> cat [-option] # (concatenate, 连续的意思),将内容连续显示出来
参数:
-n : 列出行号,连同空白行号也显示,
-b : 列出行号,仅针对非空白行
-A : 相当于-vET的整数参数,可以列出一些特殊字符,而不是空白而已
-T : 将Tab键的空白以^T显示出来
-v : 列出一些看不出来的特殊字符
...
注意:
Tab键与空格键的效果都差不,都是一堆空白,用-A就能显示那些空白地方是啥了 Tab : ^T, 断行符:$
>> tac # 反向显示, 显示结果与cat的效果是反的
>> nl [-option] # 添加行号打印
参数:
-b : 行号指定的方式,主要有两种:
-b a : 所有的行都显示出来,即使是空行,类似 cat -n
-b t : 如果是空行就不显示出来, 默认这种形式
-n : 行号表示方法,主要有三种方式:
-n ln : 行号在屏幕的最左方显示(对于缩进编辑的文件效果很明显)
-n rn : 行号在自己字段的最右方显示,且不加0
-n rz : 行号在自己字段的最右方显示,且加0
-w : 行号字段占用的位数
例如:
>> nl -n ln /etc/issue # 行号显示在屏幕的最左端
1 CentOS release 6.9(Final)
2 Kernel \r on an \m
(注意这里有一行空行)
>> nl -n rn /etc/issue # 行号在自己字段的最右方显示,且不加0
1 CentOS release 6.9(Final)
2 Kernel \r on an \m
>> nl -n rn /etc/issue # 行号在自己字段的最右方显示,且加0
000001 CentOS release 6.9(Final)
000002 Kernel \r on an \m
>> nl -n rn -w 3 /etc/issue # 行号在自己字段的最右方显示,加0,且限制位数为3位
001 CentOS release 6.9(Final)
002 Kernel \r on an \m
>>
(2)可翻页查看: more, less
/************************************/
>> more fileName # 查阅文件(只能向下翻页)
在more这个程序运行的过程中,可以用下面几个键:
空格键:向下翻一页
Enter:向下滚动一行
/字符串:向下查询“字符串”这个关键字
:f :显示文件名及目前所显示的行数
q : 退出more程序
b或[crt-b] : 往回翻页,但只对文件有效,对管道无效
/************************************************************/
>> less fileName # 查阅文件(可以上下翻页)
在less里面可以使用的查询功能:
空格键 :向下翻一页
[PageDown] : 向下翻动一页
[PageUp] : 向上翻动一页
/字符串 :向下查询
?字符串 :向上查询
n : 向下重复前一个查询(与/或?有关)
N : 反向重复前一个查询(与/或?有关)
q : 离开less这个程序
注意:man这个命令就调用less来显示说明文件的内容。
(3)数据选取: head, tail,
>> head [-option] #取出前几行
参数:
-n # 后面接数字,表示显示几行的意思,默认显示前10行
注意:-n后接负数的话,表示前面所有的行都显示,就是不显示后面这几行
>> head -n -100 # 表示前面所有行,只是不显示后面100行
/*********************************************/
>> tail [-option] # 取出后几行
参数:
-n : 后接数字,表示显示几行(后面几行), 默认是显示10行
-f : 表示持续检测后面所接的文件名,要等到按下Ctrl-C才会结束tail的就检测
注意:如果想显示/etc/man.config的第11到第20行呢?
>> head -n 20 /etc/man.config | tail -n 10 # 先取文件的前20行,再取这部分的后10行
注:这里使用了管道命令
(4)非纯文本文件:od(多对于开发人员有用)
>> od [-option] fileName # 将数据文件或者是二进制的文件读取出来
参数:
-t : 后面接各种类型的输出
a : 利用默认的字符来输出
c : 使用ASCII字符输出
d[size] : 利用十进制(decimal)来输出数据,每个整数占用sieze bytes
f[size] : 利用浮点树(floating)来输出数据,每个树占用size bytes
o[size] : 利用八进制(octal)来输出数据,每个整数占用size bytes
x[size] : 利用十六进制(hexadecimal)来输出数据,每个整数占用size bytes
oCc : 将文件内容以八进制列出存储值与ASCII的对照表。
(5)修改文件时间或创建新文件:touch
一个文件在Linux下都会记录许多时间参数,有三分主要的参数:
mtime (modification time) # 修改时间
当文件的内容数据(只是内容,不是文件属性和权限)更改时,这个时间就会更新。ls命令默认都是显示这个时间
ctime (status time) # 状态时间
文件状态(status)改变时,就会更新这个时间,如权限与属性
atime (access time) # 读取时间
当"该文件的内容被取用"时,就会更新这个时间,例如使用cat去读取文件内容时,就会更新该时间
例如:
>> ls -l --time=ctime /etc/man.config # 显示的文件时间信息是状态时间(即创建的时间)
文件的时间很重要,因为,如果文件的时间误判的话,可能回造成某些程序无法顺利运行。因此,当
发现文件时间超前时,就需要修改文件的时间:touch
>> touch [-option] fileName # 修改时间参数
参数:
-a : 仅修改访问时间
-c : 仅修改文件的时间,如文件不存在,则不创建新文件
-d : 后跟想要修改的日期而不用当前的日期,也可以使用"--date=日期或时间"
-m : 仅修改mtime
-t : 后面可以接修改的时间而不用目前的时间,格式为[yyMMDDhhmm]
例如:
>> touch /tmp/test0 # 如果test0不存在,就会创建新的空文件夹,且这三个时间会设置成当前的时间
注意:
1.touch命令可以轻易修改文件的日期与时间,并也可以创建一个空的文件。但是,在复制时,即使复制
了全部的属性,也没有办法复制ctime,它代表文件最近的状态被改的时间。
2.我们最关心的还是mtime。关心文件是什么时候被改动过的
3.touch的常用的情况:
创建一个空的文件
将某个文件日期修改为目前日期(mtime,atime)
4.文件与目录的默认权限与隐藏权限
一个文件除了rwx属性外,在Linux的Ext2/Ext3文件系统下,还可以设置文件的其他隐藏属性,可用chattr来设置。
用lsattr来查看,最重要的属性就是可以设置成其不可修改的特性,让文件的所有者都不能修改,这个属性设置
在安全机制方面很重要。
(1)文件默认权限查询:umask
>> umask # 查询文件默认的权限情况, 以数字的形式显示
>> 0022 # 只关注后三位数字,第一位是特殊权限,指的是:SUID,SGID,SBIT的权限(后面讲)
>> umask -S # 查询文件默认的权限情况,以字符类型的方式显示
>> u=rwx,g=rx,o=rx # 以字符的形式显示
执行权限(x)对于目录很重要,但对文件就不需要该权限了。因此,在默认的情况:
创建"文件": 默认没有可执行(x)权限,即只有r,w。即最大是666, -rw-rw-rw-
创建"目录": 默认有可执行(x)权限,不然别人是无法进入该目录的,即777, drwxrwxrwx
注:上面的'0022'表示在默认权限值的基础上需要减掉的权限,这里当然就需要减掉:'-----w--w-'
那么新建文件默认权限:(-rw-rw-rw-)-(-----w--w-)=-rw-r--r--
新建目录默认权限:(drwxrwxrwx)-(-----w--w-)=drwxr-xr-x
/*******************************/
设置文件默认权限
>> umask 002 # 直接就将要减掉的权限设置为002
注意:在root的umask中会拿掉比较多的属性,为了安全考虑,一般为:022
一般用户的umask为:002, 这也就可以保留同用户组的写入权限
(2)文件隐藏属性chattr,lsattr
>> chattr [+-=] [ASacdistu] 文件或目录 # 改命令只能用于Ext2/Ext3的文件系统, 该命令在系统安全上很重要
参数:
+ :只增加某一个特殊参数
- : 只删除一个特殊参数
= :仅设置后面接的参数
a : 表示该文件只能写数据,不能删除、修改数据,只能root才能设置这个属性。log file这种记录登录数据的文件
i : 表示该文件不能被删除、改名、设置连接,也无法写入或添加数据。只用root才能设置此属性
... # 还有许多其他的属性,详情man chattr去查看
注意:如果要添加a,i的属性,则可以写成这样:
>> chattr +ai test # 表示给目录test添加a,i属性
>> lsattr [-adR] 文件或目录 # 显示文件隐藏属性
参数:
-a :将隐藏文件也显示出来
-d : 如果连接的是目录,仅列出目录本身的属性而非目录内的文件名
-R :连同子目录的数据也一并列出来
(3)文件特殊权限:SUID, SGID, SBIT
SUID <—— SetUID
当s这个标志符出现在某个文件'所有者'的(x)权限上时,就称该文件被Set UID, 简称为SUID的特殊权限。
该特殊权限的目的是为了让一般用户暂时(在命令执行过程中)有对该文件的root权限,这样该用户就可以通过
该文件去访问那些原本需要root权限的文件并修改它们。
那么SUID的权限对于一个文件的特殊功能是什么?
SUID权限仅对二进制程序有效
执行者(该程序所有者以外的其他用户)对于该程需要有(x)的可执行权限
本权限仅在执行该程序的过程中有效
执行者(该程序所有者以外的其他用户)将具有该程序所有者(owner)的权限
注意:
该特殊权限仅对文件有效,对目录是无效的
SGID <-- SetGID
当s这个标志符出现在某个文件'用户组'的(x)权限上时,就称该文件被Set GID, 简称为SGID的特殊权限。
那么SGID的权限对于一个文件的特殊功能是什么?
SGID对二进制程序有用
程序执行者对于程序来说,需具备x权限
执行者(该程序所有者以外的其他用户)在执行的过程中将会获得该程序用户组的支持
注意:该特殊权限对文件和目录均有效
当一个目录被设置了SGID的权限后,具有下面的功能:
用户若对此目录具有r, x 权限是,该用户能够进入此目录
用户在此目录下的有效用户组将会变成该目录的用户组
若用户在此目录下具有w权限,则用户所创建的新文件的用户组与此目录的用户组相同。
SBIT <-- Sticky Bit
只针对目录有效,对文件无效, 用t表示。对目录的作用:
当用户对此目录具有w, x权限,即具有写入的权限时, 此时用户在该目录下创建的文件或目录,仅
有自己与root才有权利'删除'该文件
/****************************************/
如何设置SUID,SGID,SBIT的权限?
数字方法设置:
如果在chmod设置权限的数字方式方法的三个数字前面加一个数字,就表示设置这三种权限
4 为 SUID
2 为 SGID
1 为 SBIT
符号方式设置:
SUID 为 u+s
SGID 为 g+s
SBIT 为 o+t
>> chmod u=rwxs,go=x, test; ls -l test # 加SUID权限
>> -rws--x--x 1 root 0 Aug 18 23:47 test
>> chmod g+s,o+t test; ls -l test # 在上述目录上加SGID和SBIT的权限
>> -rws--s--t 1 root 0 Aug 18 23:48 test
例如:
>> chmod 7666 test; ls -l test
>> -rwSrwSrwT 1 root 0 Sep 29 03:06 test #
注意:这里的S,T表示空的,因为这三个权限需要有x权限,但这里设定的666即没有x权限,因此就可能有这三个权限
(4)查看文件类型:file
如果想知道某个文件的基本数据,例如是属于ASCII或者是data文件,或者是binary文件,其其中有没有
使用到动态函数库(share library)等信息,就可以用file命令查看
>> file ~/.bashrc
>> /root/.bashrc:ASCII text # 表明这是一个ASCII的纯文本文件
5.命令与文件的查询
需要知道一些文件放到位置,才能对其进行修改和维护
(1)脚本文件名的查询: which
可以用来查找一些"命令"所在的位置,
>> which [-option] command # 寻找执行文件
参数:
-a # 将所有由PATH目录中可以找到的命令均列出来,而不只是第一被找到的命令名称
注意:该命令默认是只能找到PATH内所规范的目录
>> which cd
>> /usr/bin/which:no cd in(列出PATH里配置的目录)
为什么会出现这个情况,明明我们是可以随处执行的cd的,它应该是在PATH里配置了才对啊。
实际上,cd是bash的内置命令,并非是因为在PATH里配置了才能随处执行的。因此,自然
就无法通过which命令寻找了。但是可以通过type(该命令bash章再讲)来查找
(2)文件名的查找:whereis, locate, find
whereis, locate 查找速度很快,因为之利用数据库来查找的,并没有在硬盘上查找,有些文件查找
不到可以使用find(只是速度慢,因为是在硬盘上直接查找的)
>> whereis [-option] 文件名或目录
参数:
-b : 只找二进制格式的文件
-m : 只找说明文件manual路径下的文件
-s : 只找source源文件
-u : 查找不在上述选项当中的其他特殊文件
注意:
1.要是什么参数都不带的话,就默认查询所有相关名称的文件
2.为什么whereis查询速度比find快的多,这是因为Linux系统会将系统内的所有文件都记录在一个数据
库文件里,而使用whereis或locate时都是直接以此数据库文件的内容为准查找的,
>> locate [-option] keyword # 查询名称不一定是精确的名称,支持模糊查询
参数:
-i : 忽略大小写的差异
-r : 后面可接正则表达式的显示方式
例如:
>> locate passwd # 找出系统中所有与passwd相关的文件名, 并非只是与这个名称相等才被列出
注意:
1.locate命令的缺点,由于是基于数据库(/var/lib/mlocate)查询的,但是数据库的更新是有时间差的,这样就可能有些
文件查询不到。
2.但是这个数据库是可以手动更新的,直接输入"updatedb", 这命令会去读取/etc/updatedb.conf 这个配置文件的设置,
然后再去硬盘里进行查找文件名的操作,最后就更新/var/lib/mlocate内的数据库文件,这个过程可能会慢点。
/*********************************************************/
>> find [PATH] [-option] [action]
第一种参数:
1.与时间有关的参数共有:-atime,-ctime, -mtime, 例如-mtime
-mtime n : n为数字,意义为在n天之前的"一天之内"被更改过的文件, 即[n, n+1)天
-mtime +n : 列出在n天之前(不含n天本身, 即从第n+1那天起)被更改过的文件名, (-∞, n+1]
-mtime -n : 列出在n天之内(含n天本身)被更改过的文件名, [n, now]
-newer file : file为一个存在的文件,列出比file还要新的文件名。newer可以用于分辨两个文件新旧关系
例如:
>> find / -mtime 0 # 列出24小时内被改动的文件, 0代表目前的时间,即在当前时间的一天之内
>> find / -mtime 3 # 列出3天前的24小时内, 表示从第4天的那个24小时
>> find /etc -newer /etc/passwd # 寻找/etc下面的文件,如果日期比/etc/passwd新旧列出
第二种参数:
2.与用户组和用户组名有关的参数
-uid n : n为数字,这个数字是用户的账号UID, 具体在后面讲
-gid n : n为用户组名的ID,
-user name : name为账号名称
-group name : name为用户组名,例如users
-nouser : 寻找文件的所有者不存在的文件
-nogroup : 寻找文件的所有用户组不存在的文件
例如:
>> find /home -user vbird # 查找/home下面属于vbird的文件
>> find / -nouser # 查找系统中不属于任何人的文件
第三种参数:
3.与文件权限及名称有关的参数
-name filname : 查找文件名为fileName的文件
-size [+-]SIZE : 查找比SIZE大(+)或小(-)的文件,SIZE取值:c(byte), k(1024bytes)
-type TYPE : 查找文件的类型为TYPE的文件,有:一般正规文件(f),设备文件(b,c),目录(d),连接文件(l),socket(s), FIFO(p)等属性
-perm mode : 查找权限刚好为mode的文件,如775, 47421
-perm -mode : 被查找列出来的文件的权限要多于等于mode的权限
-perm +mode : 被查找列出来的文件的权限只要有一个符合mode的权限即可,
注意:
perm参数值是要与三大块(即owner, group, others)对应符合才行
这里也可以将具有SUID(4),SGID(2),SBIT(1)权限的文件查找出来,加载权限的前面即可,如6000
第四种参数:
4.其他可进行的参数
-exec command : command 为其他命令,
-print : 将结果打印到屏幕上,这个是默认的操作
例如:
>> find / -perm +7000 -exec ls -l {} \; # 将前查找到的数据 ls -l 列出来,注意这里的ls -l不能用别名(ll)替换
解释:{}代表又find查找的内容,即查找的结果会放置到{}中,find额外菜单的开始(-exec)到结束(\;),中间为find的额外命令(ls -l),
由于(;)在bash环境下是由特殊意义的,因此这里需要转义
注意:find支持通配符的来查找文件
6.权限与命令间的关系(极其重要)
有些命令必须要在特定的权限下才执行
(1)让用户'进入'某个目录称为"工作目录"的基本权限?
可用的命令:cd
拥有目录的权限:至少要有x权限
额外需求:如果用户想要在该目录内利用ls查阅文件名,则用户对此目录需要有r
(2)让用户在某个目录内读取一个文件的基本权限?
可用的命令:cat, more, less
拥有目录的权限:至少要有x权限
拥有文件的权限:至少要有r权限
(3)用户可以修改一个文件的基本权限?
可用的命令:nano, vi编辑器
拥有目录的权限:至少要有x权限
拥有文件的权限:至少要有r, x权限
(4)用户可以创建一个文件的基本权限?
拥有目录的权限:至少要有w, x权限
(5)用户可以执行某个目录下的命令的基本权限?
拥有目录的权限:至少要有x权限
拥有文件的权限:至少要有x权限
例如:让用户vbird能够进行"cp /dir1/file1 /dir"的命令时,dir1, file1, dir2需要的最小权限?
执行cp时,用户要能够进入dir并读取源文件file1, 再写入dir中,因此需要最小权限:
dir: x
file1: r
dir: x, w