文章目录
- 1 生成链接文件:ln
- 2 权限管理
- 2.1 更改文件或目录权限:chmod
- 2.2 改变文件或目录所有者:chown
- 2.3 改变文件或目录所属组:chgrp
- 2.4 显示、设置文件的缺省权限:umask
- 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表示的意思如下:
对于【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