文章目录

  • ​​1 生成链接文件:ln​​
  • ​​2 权限管理​​
  • ​​2.1 更改文件或目录权限:chmod​​
  • ​​2.2 改变文件或目录所有者:chown​​
  • ​​2.3 改变文件或目录所属组:chgrp​​
  • ​​2.4 显示、设置文件的缺省权限:umask​​
  • ​​3 文件搜索​​
  • ​​3.1 最强大的搜索命令:find​​
  • ​​3.11 根据【文件或目录名称】搜索​​
  • ​​3.12 根据【文件大小】搜索​​
  • ​​3.13 根据【所有者和所属组】搜索​​
  • ​​3.14 根据【时间属性】搜索​​
  • ​​3.15 根据【文件类型或i节点】搜索​​
  • ​​3.16 【组合条件】搜索​​
  • ​​3.2 在文件资料库中查找文件命令:locate​​
  • ​​3.3 搜索命令所在的目录及别名信息:which​​
  • ​​3.4 搜索命令所在的目录及帮助文档路径:whereis​​
  • ​​3.5 在文件中搜寻字符串匹配的行并输出:grep​​

1 生成链接文件:ln

命令名称:ln
英文原意:link
功能描述:生成链接文件

语法: ln -s 【源文件】【目标文件】
   -s    创建软链接
  不加 -s 创建硬链接

示例如下:

$ ls
a.txt
$ ln -s a.txt a.soft # 创建软连接
$ ln a.txt a.hard # 创建硬连接
$ ls -lh
total 8.0K
-rw-r--r-- 2 xw xw 2.9K Oct 31 15:24 a.hard
lrwxrwxrwx 1 xw xw 5 Nov 5 11:55 a.soft -> a.txt
-rw-r--r-- 2 xw xw 2.9K Oct 31 15:24 a.txt

通过观察可以看到:

第一:软链接前面是 l 开头的(link),而硬链接是 - 开头,表示文件

第二:软链接所有者和所属组具有全部操作的权限,rwxrwxrwx;而硬链接不是。也就是软链接的前面都是 lrwxrwxrwx

第三:软链接类似于windows 的快捷方式,有一个明显的箭头指向,而指向的是源文件

第四:硬链接文件除了文件名与源文件不一样,其余所有信息都是一样的。类似于 cp 复制操作。但是又和复制不一样,硬链接可以同步更新

第五:通过 ls -i 操作,来查看 文件的 i 节点。发现硬链接和源文件的 i 节点是相同的,而软链接与源文件的 i 节点是不同的

第六:不允许将硬链接指向目录不允许跨分区创建硬链接

2 权限管理

2.1 更改文件或目录权限:chmod

命令名称:chmod
英文原意:change the permissions mode of a file
功能描述:改变文件或目录权限

语法: chmod 【{ugoa}{±=}{rwx}】【文件或目录】
  【mode=421】【文件或目录】
   -R 递归修改

对于上面的语法 chmod 【{ugoa}{±=}{rwx}】【文件或目录】,我们要知道ugoa分别是:u:表示所有者,g:表示所属组,o:表示其他人,a:表示所有人。而rwx表示的意思如下:

【Linux学习笔记2】- 权限管理与文件搜索_权限


对于【mode=421】【文件或目录】,这是将权限用数字表示,其中 r 表示4,w表示2,x表示1,分别是2的2次方,1次方,0次方。那么我们可以这样理解:具有 rwx 权限的数字就是 7,具有 rw- 权限的数字是 6,具有 r-- 权限的数字是 4。

注意:不是每一个Linux用户都有权限更改某个文件或目录权限,能更改文件或目录权限的只有两种用户
①、文件的所有者。我们通过ls命令查看某个文件的详细信息,可以看到该文件的所有者。
②、root用户,这不用多说,root用户是linux系统权限最大的用户。别人不能干的事,root用户都能干。

示例如下:

$ ls -lh
total 4.0K
-rw-r--r-- 1 xw xw 2.5K Nov 5 12:01 a.txt
$ chmod u+x,g+w,o+x a.txt
$ ls -lh
total 4.0K
-rwxrw-r-x 1 xw xw 2.5K Nov 5 12:01 a.txt

上述代码中,chmod赋予所有者 x 的权限;赋予 所属组 w 权限,其他人 x 权限。

+指增加一个权限,-指去掉一个权限,=指赋予一个权限。

将上面例子改为用 数字来操作,也就是说我们要给a.txt赋予的文件权限是 rwxrw-r-x,用数字表示是765,代码如下:

$ ls -lh
total 0
-rw-r--r-- 1 xw xw 0 Nov 5 12:38 a.txt
$ chmod 765 a.txt
$ ls -lh
total 0
-rwxrw-r-x 1 xw xw 0 Nov 5 12:38 a.txt

还可以递归赋予权限,也就是加上 -R 参数给指定目录下的所有文件或目录赋予指定权限,示例代码如下:

$ ls -lh naruto # naruto目录下有三个文件abc
total 0
-rw-r--r-- 1 xw xw 0 Nov 5 12:43 a
-rw-r--r-- 1 xw xw 0 Nov 5 12:43 b
-rw-r--r-- 1 xw xw 0 Nov 5 12:43 c
$ chmod -R 765 naruto # 递归改变权限
$ ls -lh naruto # 目录中的文件权限也变了
total 0
-rwxrw-r-x 1 xw xw 0 Nov 5 12:43 a
-rwxrw-r-x 1 xw xw 0 Nov 5 12:43 b
-rwxrw-r-x 1 xw xw 0 Nov 5 12:43 c

2.2 改变文件或目录所有者:chown

命令名称:chown
英文原意:change file ownership
功能描述:改变文件或目录的所有者
语法: chmod 【用户】【文件或目录】

注意:能更改文件或目录的所有者用户是 root

$ ls -lh
total 0
-rw-r--r-- 1 xw xw 0 Nov 5 13:23 a.txt
$ chown xw a.txt # 更改a.txt的所有者为xw

2.3 改变文件或目录所属组:chgrp

命令名称:chgrp
英文原意:change file group ownership
功能描述:改变文件或目录的所属组
语法: chgrp【用户组】【文件或目录】

注意:能更改文件或目录的所有者用户是 root

2.4 显示、设置文件的缺省权限:umask

命令名称:umask
英文原意:the user file-creation mask
功能描述:显示、设置文件的缺省权限
语法: umask 【-S】
   -S 以rwx形式显示新建文件的缺省权限

$ umask
0022
$ umask -S
u=rwx,g=rx,o=rx

在上述代码中,umask 执行显示结果是 0022,第一个0表示特殊权限,后面会单独讲解有哪几种特殊权限。022表示权限的掩码值,我们用7 7 7 减去 0 2 2得到755(是每一位相减),表示的就是下面通过加上-S输出的rwxr-xr-x,这个值用数字表示就是755.

说明创建一个文件的默认权限所有者为rwx,所属组为rx,其他人为rx。也就是说创建一个新文件默认权限为 rwxr-xr-x,创建一个文件来验证一下:

$ touch a.txt
$ ls -lh a.txt
-rw-r--r-- 1 xw xw 0 Nov 5 13:36 a.txt

发现用touch命令创建了一个文件a.txt,然后发现权限并不是rwxr-xr-x,而是rw-r–r--。对比发现少了三个x,也就是少了可执行权限。这是为什么呢?

因为在Linux系统中,所有新创建的文件都是没有可执行权限的。这是出于Linux系统的一种自我保护,因为类似的病毒木马程序都是具有可执行权限的。所以在Linux系统中,新创建的文件是没有可执行权限的。

那如何设置默认权限呢?比如我们想将新创建的文件权限设置为rwxr-xr–,也就是754。我们用777减去754得到023。也就是通过执行 umask 023 来完成默认权限设置。

3 文件搜索

3.1 最强大的搜索命令:find

find命令是Linux中用来进行文件搜索用的最多的命令,功能强大。但是搜索很占系统资源。所以在进行Linux文件整理的时候,尽量规范化,什么文件放在什么目录下都要有比较好的约定。

功能描述:进行各种花式文件搜索(Linux严格区分文件大小写)。
语法:find【搜索范围】【匹配条件】

3.11 根据【文件或目录名称】搜索

find 【搜索目录】【-name或者-iname】【搜索字符】:-name和-iname的区别一个区分大小写,一个不区分大小写。

示例:
① find -name init (精准搜索,名字必须为 init 才能搜索的到)
② find -iname init (精准搜索,名字必须为 init或者有字母大写也能搜索的到)
③ find -name ‘*init’ (模糊搜索,以 init 结尾的文件或目录名,要加引号)
④ find -name ‘init???’ (模糊搜索,? 表示单个字符,即搜索到 init___,要加引号)

$ ls # 无输出结果,说明当前路径下无文件或目录
$ touch init init.txt Init goodinit initabc # 创建一些文件
$ mkdir badinit inithhh # 创建两个目录
$ ls -lh # 当前路径下有以下的文件及文件夹
total 0
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 Init
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 badinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 goodinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init.txt
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 initabc
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 inithhh
$ find -name init
./init
$ find -iname init
./Init
./init
$ find -name '*init'
./badinit
./goodinit
./init
$ find -name 'init???'
./initabc
./inithhh

3.12 根据【文件大小】搜索

如在当前目录下查找大于 100M 的文件:find -size +204800。这里 +n 表示大于,-n 表示小于,n 表示等于。1 数据块 = 512 字节 =0.5KB,也就是1KB等于2数据块。100MB == 102400KB==204800数据块。

$ ls -lh # 看看当前路径下的所有文件与目录
total 0
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 Init
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 badinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 goodinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init.txt
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 initabc
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 inithhh
$ find -size 8 # 8个数据块为4KB,即找大小正好为4KB的文件或目录
.
./badinit
./inithhh

3.13 根据【所有者和所属组】搜索

示例:
在当前目录下查询所属组为 xw 的文件(xw是我的电脑的Linux账户名):find -group xw
在当前目录下查询所有者为 xw 的文件(xw是我的电脑的Linux账户名):find -user xw

$ ls -lh
total 0
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 Init
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 badinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 goodinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init.txt
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 initabc
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 inithhh
$ find -group xw
.
./badinit
./goodinit
./Init
./init
./init.txt
./initabc
./inithhh
$ find -user xw
.
./badinit
./goodinit
./Init
./init
./init.txt
./initabc
./inithhh

3.14 根据【时间属性】搜索

find 【路径】【选项】【时间】

选项有下面三种:
-amin 访问时间(access)
-cmin 文件属性被更改(change)
-mmin 文件内容被修改(modify)

时间:+n,-n,n分别表示超过n分钟,n分钟以内和n分钟。

示例:
在当前目录下查找5 分钟内被修改过属性的文件和目录:find -cmin -5

3.15 根据【文件类型或i节点】搜索

-type根据文件类型查找:f表示文件(file),d表示目录(directory),l表示软链接(link)

范例:

$ ls -lh
total 0
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 Init
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 badinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 goodinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init.txt
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 initabc
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 inithhh
$ find -type d # 查找当前目录下文件类型是目录的
.
./badinit
./inithhh
$ find -type f # 查找当前目录下文件类型是文件的
./goodinit
./Init
./init
./init.txt
./initabc

-inum 根据i节点查找

范例:

$ ls
Init badinit goodinit init init.txt initabc inithhh
$ ls -i # 查看当前目录下所有文件与目录及相对应的i节点值
844424930680866 Init 844424930680867 goodinit 844424930680865 init.txt 844424930680870 inithhh
844424930680869 badinit 1407374884102176 init 844424930680868 initabc
$ find -inum 844424930680867 # 查找i节点为对应编号的文件或目录
./goodinit

3.16 【组合条件】搜索

这里有两个参数:
① -a 表示两个条件同时满足(and)
② -o 表示两个条件满足任意一个即可(or)

$ ls -lh
total 0
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 Init
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 badinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 goodinit
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 init.txt
-rw-r--r-- 1 xw xw 0 Nov 12 23:53 initabc
drwxr-xr-x 1 xw xw 4.0K Nov 12 23:53 inithhh
$ find -iname '*init' # 找出以init结尾的文件或目录,init不区分大小写
./badinit
./goodinit
./Init
./init
$ find -type f # 找出文件类型是文件的
./goodinit
./Init
./init
./init.txt
./initabc
$ find -iname '*init' -a -type f # 找出以init结尾的【文件】,init不区分大小写
./goodinit
./Init
./init

3.2 在文件资料库中查找文件命令:locate

命令名称:locate
功能描述:在文件资料库中查找文件

语法:locate【文件名】
   -i 不区分大小写

注意:locate和 find 是有区别的:find是全盘检索;locate 是在文件资料库中搜索。所以locate命令的执行要比find命令执行速度很多。但是文件资料库是需要不断更新的。新创建文件后,如果不更新文件资料库,使用 locate 是查找不到的。​​updatedb​​手动更新资料库,但是对于/tmp目录下的新建文件,是更新不到文件资料库的,因为/tmp目录不属于文件资料库的收录范围。

示例:

$ ls -lh
total 0
-rw-r--r-- 1 root root 0 Nov 14 01:22 hhhhhaa
-rw-r--r-- 1 root root 0 Nov 14 01:22 hhhhhaabb
-rw-r--r-- 1 root root 0 Nov 14 01:22 hhhhhbb
-rw-r--r-- 1 root root 0 Nov 14 01:22 hhhhhbbaa
$ locate hhhhaa # 没有更新资料库,所以搜不到,这里没有任何输出
$ updatedb # 手动更新资料库
$ locate hhhhaa # 重新查找,结果如下
/root/a/hhhhhaa
/root/a/hhhhhaabb

3.3 搜索命令所在的目录及别名信息:which

命令名称:which
功能描述:搜索命令所在的目录及别名信息
语法:which【命令】

示例:

$ which pwd # 查看pwd命令所在的目录,但是没输出别名信息,不知道为啥...
/usr/bin/pwd

3.4 搜索命令所在的目录及帮助文档路径:whereis

命令名称:whereis
功能描述:搜索命令所在的目录及帮助文档路径
语法:whereis【命令】

$ whereis pwd # 搜索pwd命令所在的目录及帮助文档路径
pwd: /usr/bin/pwd /usr/share/man/man1/pwd.1.gz

3.5 在文件中搜寻字符串匹配的行并输出:grep

命令名称:grep
功能描述:在文件中搜寻字符串匹配的行并输出
语法:grep -iv 【指定字符串】【文件】
    -i 不区分大小写
    -v 排除指定字符串

示例:

$ ls
a.txt
$ cat a.txt # 显示a.txt的内容如下
i am a good man
you are good
he is bad
no, it's good
$ grep good a.txt # 在a.txt中查找包含good的行并且输出
i am a good man
you are good
no, it's good
$ grep -v good a.txt # 在a.txt中查找不包含good的行并且输出
he is bad

END