linux 修改文件属性接口

2016-04-19 17:11:01 sinat_30071459 阅读数 34330
  • Linux指令_文件权限的管理命令

    2.jeesite4.0 Eclipse 常用快捷键、 3.jeesite4.0文件结构与配置、 4.jeeiste4.0 内置模块与内置组件应用、 5.jeesite4.0代码生成器的应用、 6.jeesite4.0 Spring Boot快速入门、 7.jeesite4.0手机端基础接口文档。

    0课时 0分钟 148人学习 陈贺群
    免费试看

来自鸟哥的Linux私房菜

在Linux下,和文件有关的身份有用户组,所有者,others,这三种身份又有三种权限,即r(读)、w(写)、x(执行)。


首先,文件权限描述由10个字符组成,例如,“-rwxr-xr--”、"drwxr-xr-x".

其中,第一个字符的含义为:

d:表示目录

-:表示文件

l:表示连接文件

b:表示设备文件里面的可供存储的接口设备

c:表示设备文件里面的串行端口设置,例如键盘、鼠标


接下来的9个字符,分为三组,每组三个字符,均为“rwx”的三个参数组合。这三个字符的位置不会改变,如果没有某权限,则出现‘-’号。

这三组字符中,第一组表示文件所有者的权限;第二组表示同用户组的权限;第三组表示others的权限。


1、修改文件所属用户组

命令:chgrp

例如,修改文件install.log的所属用户组为users,则输入命令:

# chgrp users install.log

2、修改文件所有者

命令:chown

例如,修改install.log的所有者为bin,则输入命令:

# chown bin install.log

3.修改权限

命令:chmod

我们知道,Linux文件的基本权限有9个,分别是owenr、group、others三种身份各自有自己的r、w和x。假如文件的权限字符为:“-rwxrwxrwx”,这9个权限是三个三个一组的,我们可以使用数字表示权限:

r->4

w->2

x->1

所以,当文件权限为“-rwxrwx---”时,分数是:

owner->4+2+1=7

group->4+2+1=7

others->0+0+0=0

此时文件的权限数字就是770.


假如有一文件bashrc,权限字符为“-rwxrwxrwx”,我们需要修改为“-rwxr-xr--”,计算得权限数字为754,所以,执行命令:

# chmod 754 bashrc

还有一个改变权限的办法。我们知道文件有9个基本权限,分别是owner、group和others三种身份各自的三个权限,我们用u、g、o代表三种身份,用a(all)代表所有身份,得到下表:


例如,我们可以这样设置文件bashrc的权限:

# chmod u=rwx,go=rx bashrc

即user权限为rwx,group和others的权限均为rx。

如果我们想让每个人都可对文件bashrc写入,则可以:

# chmod a+w bashrc

而如果要将权限去掉,则用-。例如我们去掉全部人的执行权限:

# chmod a-x bashrc


2018-10-12 10:53:30 qq_33205418 阅读数 1184
  • Linux指令_文件权限的管理命令

    2.jeesite4.0 Eclipse 常用快捷键、 3.jeesite4.0文件结构与配置、 4.jeeiste4.0 内置模块与内置组件应用、 5.jeesite4.0代码生成器的应用、 6.jeesite4.0 Spring Boot快速入门、 7.jeesite4.0手机端基础接口文档。

    0课时 0分钟 148人学习 陈贺群
    免费试看

Linux文件属性修改及权限
Linux用户中root很牛逼,几乎无所不能,很极端的对立,一般用户一般除了自己的一亩三分地,几乎不能干任何“有技术含量的”事查看等命令,所以有点什么事都要麻烦root。root为了不累死,通过命令 把权限给一般用户,让他们能在一段时间内具备自己(root)的能力,或者说“变身”为root,这个命令就是sudo。
普通用户没有权限查看,一定要看的话可以执行“$ sudo cat /etc/shadow”,这时系统会要求输入当前用户密码,输密码虽然麻烦,但安全性高了,至少各类后台程序不能偷偷地搞小动作了(后来微软也学了这招,windows vista开始,右键就加入了新的菜单项——“以管理员身份运行”)。要给某个用户赋予sudo特权,就需要更改/etc/sudoers 文件中的内容,该文件能设置用户或用户组行使sudo权利的命令范围,甚至可以设置sudo时不用输入密码,不过这自然是不安全的,不推荐。

su命令,用来切换当前用户。所以如果嫌sudo太麻烦,就可以使用su临时切换到root用户,切换用户时须输入目标用户的密码。root用户使用su命令切换到任何用户都不需要输入密码,
文件权限解读:
在这里插入图片描述
在这里插入图片描述
第0位确认文件类型:

  • 0位为【d】是目录
  • 0位为【-】是文件
  • 0位为【l】是链接文档
  • 0位为【b】是装置文件里面的可供储存的接口设备(可随机存取装置)
  • 0位为【c】是装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)
    见上图所示
  • 第0位确定文件类型,
  • 第1-3位确定属主(该文件的拥有者者)拥有该文件的权限。(user)
    第4-6位确定属组(文件拥有者的同组用户)拥有该文件的权限,(group)
    第7-9位确定其他用户拥有该文件的权限。每三个一组(other)
    在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。

eg:d rwx r-x r-x 3 mysql mysql 4096 Apr 21 2014 mysql
- mysql 文件是一个目录文件
- 属主有可读、可写、可执行的权限;
- 与属主同组的其他用户有可读和可执行的权限;
- 其他用户也有可读和可执行的权限
chgrp:改变文件所属用户组
chown:改变文件所有者
chmod:改变文件的权限

1.chmod:改变文件的权限
我们使用chmod命令改变文件权限,如 chmod 700 testtext,这是数字权限法,还可以使用文字表示权限更改,如 chmod u+w testtext,表示给拥有者加上写权限。u、g、o、a分别表示拥有者、所属组、其他无关者和全部,+、-、=分别表示增加、减去、设定。
chmod [-R] xyz 文件或目录
更改权限的方法
1:数字更改
数字对应的权限:
r:4
w:2
x:1
rwx:4+2+1=7
r -x:4+1=5 …以此类推
如777即表示所有用户都对文件有读写执行权限,600表示只有拥有者有对该文件的权限,且该权限为读写权限即rw-。
修改权限eg:
修改前:在这里插入图片描述
修改语句:
修改
修改后:
在这里插入图片描述

2.字符更改
上面 提到的user、group、other分别用u、g、o标识,另外a代表all全部的身份
在这里插入图片描述
如图:修改目录zh的权限方法:
修改前
在这里插入图片描述
修改语句:
在这里插入图片描述
修改后:
在这里插入图片描述
在这里插入图片描述

  1. chown:改变文件拥有者

解释:当你复制文件给你之外的其他人时,由于复制行为(cp)会复制执行者的属性与权限,那么别人会无法使用你复制给他的文件所以你要更改这个文件的拥有者与群组
语法:
chown [–R] 属主名 文件名
chown [-R] 属主名:属组名 文件名
eg:chown -R user1:testgroup dir3 将dir
3文件的拥有者变为user1,属组变为testgroup
chown root:root install.log 将install.log的拥有者与群组改为root

3.charp:改变文件所属组
语法:
chgrp [-R] 属组名文件名
参数选项:
-R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
如:
chgrp -R daokr test 更改 test的 目录属于组daokr

3、统计用户个数指令 wc -l /etc/passwd
4、添加系统用户指令 useradd -r 用户名
5、设置密码指令 passwd 用户名
6、删除用户指令 userdel 用户名
7、查看当前用户信息

  • 当前用户名指令 whoami

  • 获取当前用户标识信息指令 id

  • 修改用户信息指令 usermod -

  • 指令 用户名 (具体 指令 使用
    usermod 即可查看)
    8、组管理
    用户是分组进行管理的
    创建用户时,自动创建同名用户组
    8.1 组添加
    组添加指令 groupadd 组名
    系统组添加指令 groupadd -r 组名

    8.2 组删除
    组删除指令 groupdel 组名

    8.3 组修改
    组修改指令 groupmod -指令 组名(具体 指令 使用 groupmod 即可查看)
    8.4 用户和组关系
    一个用户可以处于多个组中
    一个组内可以拥有多个用户
    查看用户所属组指令 groups 用户名
    实例:
    创建组和用户
    在这里插入图片描述
    查看用户所属组
    在这里插入图片描述
    9、普通用户获得超级用户的权限
    通过sudo命令
    在这里插入图片描述
    想使用root的某些权限需要root用户在文件中配置
    root配置权限 – vim /etc/sudoers
    在这里插入图片描述
    此时,sudo有效
    在这里插入图片描述

2019-06-18 10:41:21 github_37882837 阅读数 377
  • Linux指令_文件权限的管理命令

    2.jeesite4.0 Eclipse 常用快捷键、 3.jeesite4.0文件结构与配置、 4.jeeiste4.0 内置模块与内置组件应用、 5.jeesite4.0代码生成器的应用、 6.jeesite4.0 Spring Boot快速入门、 7.jeesite4.0手机端基础接口文档。

    0课时 0分钟 148人学习 陈贺群
    免费试看

扩展属性(xattrs)提供了一个机制用来将《键/值》对永久地关联到文件,让现有的文件系统得以支持在原始设计中未提供的功能。扩展属性是文件系统不可知论者,应用程序可以通过一个标准的接口来操纵他们,此接口不因文件系统而异。每个扩展属性可以通过唯一的键来区分,键的内容必须是有效的UTF-8,格式为namespace.attribute,每个键采用完全限定的形式。

需要注意的是这里的值可以是任意字节的数组,未必是字符存,而且最后可能不是null,这样在访问的时候必须知道值的大小。在设置的时候当然也就需要设置值大小。

一个扩展属性的用处:GUI的文件管理程序的行为根据文件类型而异。要判断文件的格式,Winodws之类的操作系统仅需要查看文件的扩展名就可以了,而Unix系统往往需要查看文件的内容来判断类型。有些文件管理程序会直接产生此信息,有些则会将产生的信息缓存起来以备下次使用。一个更好的做法就是将此类元数据存入扩展属性。
Linux下定义的4种扩展属性命名空间:

system:用于实现利用扩展属性的内核功能,例如访问控制表。eg:system.posix_acl_access便是位于此用户空间的扩展
属性,用户是否可以读取或写入这些属性取决于所使用的安全模块
security:用于实现安全模块
trusted:把受限制的信息存入用户空间
user: 一般进程所使用的标准命名空间,经过一般文件权限位来控制此命名空间的访问

下面是一些使用扩展属性的常用命令:

创建文件

touch hello.txt

设置扩展属性aaa=1111

setfattr -n user.aaa -v 1111 hello.txt

查看扩展属性

getfattr -n user.aaa hello.txt

删除扩展属性

setfattr -x user.aaa hello.txt

列出所有扩展属性

attr -lq hello.txt

其中
-n 表示属性名称,表示取出该属性的数据内容。若是都没指定参数只有接文件名,会列出所有设定上去的属性名称列表。
-v 后面接属性的储存内容。
-x 表示删除该属性数据。

注意:name 一定是要以 user. 开头项目 (为namespace,一般称呼为命名空间),要不然执行期会出现 operation not supported 错误。

2018-05-03 14:33:59 vic_qxz 阅读数 1124
  • Linux指令_文件权限的管理命令

    2.jeesite4.0 Eclipse 常用快捷键、 3.jeesite4.0文件结构与配置、 4.jeeiste4.0 内置模块与内置组件应用、 5.jeesite4.0代码生成器的应用、 6.jeesite4.0 Spring Boot快速入门、 7.jeesite4.0手机端基础接口文档。

    0课时 0分钟 148人学习 陈贺群
    免费试看

1.  Linux中的文件

1.1 【文件属性概述】

Linux里一切皆文件!

Linux系统中的文件或目录属性主要包括:索引节点(inode)、文件类型、权限属性、链接数、所归属的用户和用户组、最近修改时间等内容。

       一般用ls -lhi即可查看文件属性:

[root@test testdir]# ls -lhi

total 14M

262270 -rw-r--r--. 1 root root    0 Mar 17 05:24 a.txt

262259 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big10.sh

262275 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big1.sh

262277 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big2.sh

284753 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big3.sh

284754 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big4.sh

284755 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big5.sh

284756 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big6.sh

284757 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big7.sh

284758 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big8.sh

284759 -rw-r--r--. 1 root root 1.3M Mar 21 09:20 big9.sh

262274 -rw-r--r--. 1 root root 1.3M Mar 21 09:18 big.sh

262273 -rw-r--r--. 1 root root    0 Mar 17 05:24 lidao.txt

262279 -rw-r--r--. 1 root root   64 Mar 17 05:36 num.txt

284652 -rw-r--r--. 1 root root   29 Mar 19 17:26 oldboy.txt

284819 drwxr-xr-x. 2 root root 4.0K Mar 21 10:00 scripts

262284 -rw-r--r--. 1 root root   30 Mar 17 05:53 stu.txt

262272 -rw-r--r--. 1 root root    0 Mar 17 05:24 test.txt.txt

[root@test testdir]#

 

[root@oldboyedu-35 scripts]# ls -lhi /etc/hosts

129822 -rw-r--r--. 2 root root 158 Mar 16 20:07 /etc/hosts

[root@oldboyedu-35 scripts]#

 

12988

inode号码(家庭住址)

-

文件类型

rw-r--r--.

权限

2

硬链接数(超市入口数量,可以通过多少个门进入超市)

root

属主,文件所有者

root

属组,所有者属于的组

Mar 16 20:07

文件修改时间

/etc/hosts

文件或目录的名字(不属于属性)

 

文字解释:

第一列:inode索引节点编号,每个分区里唯一(相当于人的身份证号 家庭住址,全国唯一);

系统读取文件首先通过文件名找到inode号码,然后才能读取到文件内容。

第二列:文件类型及权限。第二列共11个字符:其中第一个字符为文件类型,随后的9个字符为文件的对应权限,最后一个字符点好"."是和selinux有关的一个标识;

第三列:硬链接个数(详细参看ln命令的讲解);linux里面文件和程序的存在必须要有用户组满足相应的存在需求。

第四列:文件或目录所属的用户文件的所有者(属主);

第五列:文件或目录所属组(属组)(家庭);

第六列:文件或目录的大小;

第七八九列:文件或目录的修改时间;默认月日时分;

第十列:实际的文件或目录名。

文件名不算文件的属性

 

1.2 【索引节点inode

1.2.1 inode概述】

预备知识

硬盘的使用过程:

       硬盘要存放数据(房子住人),首先要分区(隔断),然后格式化创建文件系统(装修-装修风格),最后挂载(没有挂载:没有门窗的监狱),才能存数据(住人)。

       Inode,中文意思是索引节点(index node。在每个linux存储设备或存储设备(磁盘或硬盘)的分区(存储设备可以是硬盘、软盘、U......格式化为多个ext4centOS6.7文件系统,一般生成两部分:第一部分是Inode(很多个),第二部分是Block(很多个)。

这个Block(块)是用来存储实际数据用用的,例如:照片,视频等普通文件数据。

inode就是用来存储这些数据属性信息的(也就是ls -l的结果),inode属性信息包括不限于文件大小、属主(用户)、归属用户组、文件权限、文件类型,[修改]时间,还包含指向文件实体的指针功能(你的Block的位置,inode节点--block的对应关系)等,但是inode里面唯独不包含文件名本身。(文件的名字不是文件的属性)

 

Inode:存放的是文件/目录属性信息

Block:实际存放数据的位置/空间

 

Inode除了记录文件属性信息外,还会为每个文件进行信息索引,所以就有了inode的数值。操作系统根据指令,即可通过inode的值最快的找到相对应的文件实体。

 

 

1.2.2 linux系统中文件的访问过程】

linux系统中,文件的访问过程一般是通过文件名找到对应的inode,通过inode存储的文件信息找到对应的block,从而找到对应的文件,如下图:

 

 

1.3 inodeblock

因为inode要存放文件的属性信息,所以每个inode本身是有大小的,centOS5系列inode默认大小是128字节,而centOS6系列inode的默认大小是256字节,inode的大小在分区倍格式化创建文件系统之后定下来,格式化以后就无法更改inode的大小,格式化之前可以通过参数指定inode的大小,但是一般企业工作环境没有这个需求。

 

查看inode大小:

查看node的大小可以利用dumpe2fs来查看:

[root@test testdir]# dumpe2fs /dev/sda3 |grep -i "inode size"

dumpe2fs 1.41.12 (17-May-2010)

Inode size:           256

[root@test testdir]# dumpe2fs /dev/sda1 |grep -i "inode size"

dumpe2fs 1.41.12 (17-May-2010)

Inode size:           128

[root@test testdir]#

 

inode使用情况:

       查看inode的使用情况可以用df -i来查看:

[root@test testdir]# df -i

Filesystem     Inodes IUsed  IFree IUse% Mounted on

/dev/sda3      462384 58428 403956   13% /

tmpfs          125517     1 125516    1% /dev/shm

/dev/sda1       51200    38  51162    1% /boot

[root@test testdir]#

 

1.3.1 【有关Inode小结】

来源

    磁盘被分区并格式化ext4文件系统(装潢风格)后会生成一定数量的inodeblock

意义

       inode称为index node索引(目录)节点,它的作用是存放文件的属性信息以及作为文件内容的索引(位置)(指向文件的实体block)。

特点

ext3/ext4文件系统(centOS5.x/centOS6.x默认的文件系统)下,一个非空的文件至少要占一个inode和一个block(文件size比较大)。

       inode节点号相同的文件,互卫为链接文件,可以认为是一个文件的不同入口

       inode在某一个文件系统(分区),是唯一的。

使用

    ls -i 或者 df -i

 

1.3.2 【有关Block的小结】

来源

       磁盘被分区并格式化ext4文件系统(装潢风格)后会生成一定数量的inodeblock

意义

       block是用来存储实际数据的,每个block的大小一般有1K2K4K几种。其中引导分区等为1K,其他普通分区多为4KC6)。

特点

       磁盘读取时按block为单位读取的。

       一个文件可能占用多个block。每读取一个block就会消耗一次磁盘I/Oinput/output 磁盘读写)。

       一个block剩余空间会被浪费,无论男人多小。

使用

    dunpe2fs /dev/sda3grep -i "block size"

       df -h

block大小的查看:

[root@oldboyedu-35 /]# dumpe2fs /dev/sda3 |grep -i "block size"

dumpe2fs 1.41.12 (17-May-2010)

Block size:               4096

[root@oldboyedu-35 /]#

 

block使用情况查看:

[root@oldboyedu-35 /]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       6.9G  1.6G  4.9G  25% /

tmpfs           491M     0  491M   0% /dev/shm

/dev/sda1       190M   33M  147M  19% /boot

[root@oldboyedu-35 /]#

 

1.4 【企业案例】

1.4.1 如果向磁盘写入数据提示如下错误:No space left on device,通过df -h查看磁盘空间,发现没满,请问可能原因是什么?企业场景什么情况下回导致这个问题发生?

 

企业案例模拟:

mkdir -p /app/logs  

dd if=/dev/zero of=/dev/sdc bs=8K  count=10

ls -l /dev/sdc

mkfs.ext4 /dev/sdc

 

tune2fs -c -1 /dev/sdc

mount -o loop /dev/sdc /app/logs

一般发生这种情况都是inode使用完了引起的。

inode满了:

[root@test ~]# #磁盘空间满了 inode满了 

[root@test logs]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       6.9G  1.7G  4.9G  25% /

tmpfs           491M     0  491M   0% /dev/shm

/dev/sda1       190M   34M  147M  19% /boot

/dev/sdc         73K   14K   55K  21% /app/logs

[root@test logs]# df -i

Filesystem     Inodes IUsed  IFree IUse% Mounted on

/dev/sda3      462384 58765 403619   13% /

tmpfs          125517     1 125516    1% /dev/shm

/dev/sda1       51200    38  51162    1% /boot

/dev/sdc           16    11      5   69% /app/logs

[root@test logs]# cd /app/logs/

[root@test logs]# touch {1..6}

touch: cannot touch `6': No space left on device

[root@test logs]# touch oldboy.txt

touch: cannot touch `oldboy.txt': No space left on device

[root@test logs]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       6.9G  1.7G  4.9G  25% /

tmpfs           491M     0  491M   0% /dev/shm

/dev/sda1       190M   34M  147M  19% /boot

/dev/sdc         73K   14K   55K  21% /app/logs

[root@test logs]# df -i

Filesystem     Inodes IUsed  IFree IUse% Mounted on

/dev/sda3      462384 58765 403619   13% /

tmpfs          125517     1 125516    1% /dev/shm

/dev/sda1       51200    38  51162    1% /boot

/dev/sdc           16    16      0  100% /app/logs

一般情况下,发生磁盘空间不足的情况下要检查一下两个方面:

1)检查inode是否用完

2)检查block是否用完

1.4.2 【删除文件名是乱码的文件】

方法一:通过inode来删除文件

#1.查看文件的inode号码

[root@test testdir]# ls -lhi '\-p'

284654 -rw-r--r--. 1 root root 0 Mar 22 02:05 \-p

[root@test testdir]#

#2.通过inode删除文件

[root@test testdir]# rm -f $(find /oldboy/ -inum 284654)

[root@test testdir]# ll '\-p'

ls: cannot access \-p: No such file or directory

[root@test testdir]#

 

方法二:文件名放在单引号中删除

[root@test testdir]# rm -f '\--p'

[root@test testdir]# ll '\--p'

ls: cannot access \--p: No such file or directory

[root@test testdir]#

 

方法三:

rm -f --

#--参数的结束标志,--前面的命令的参数,后面是你要处理的文件。

[root@test testdir]# rm -f -- |--o

[root@test testdir]# ll '|--o'

ls: cannot access |--o: No such file or directory

[root@test testdir]#

 

2.  文件类型及扩展名

2.1 【文件类型介绍】

Linux系统中,可以说一切(包括目录、普通文件、设备文件)皆文件。文件类型包含有普通文件、目录、字符设备文件、块设备文件、符号/软连接文件、管道文件等等。

Linux下面如何查看一个文件的文件类型:

1ls -l

2flie

 

       ls -l显示文件属性内容后,第一列的第一个字符就是用来区分文件类型的:

文件类型标识符

文件类型说明

ddirectory

这是一个目录文件,如上文ext,在ext2fs中,目录是一个特殊文件。

-(regular file)

这是一个普通文件,如上文的oldboy.txt

llink

这是一个符号/软链接文件,实际上它指向另一个文件。(相当于windows的快捷方式)

bblock

标识块设备和其他的外围设备,是特殊类型的文件。

ccharacter

标识字符设备文件。

ssocket

标识socket(套接字)文件。

pnamed pipe

标识管道文件。

 

find 命令 -type的文件类型的参数:

b   blockbufferedspecial

c   characterunbufferedspecial

d   directory

p   named pipeFIFO

f   regular file

l   symbolic link

s   socket

D   doorSolaris

 

2.2 【文件类型分别介绍】

2.2.1 【普通文件(regular file)】

[root@test testdir]# ls -l oldboy.txt

-rw-r--r--. 1 root root 29 Mar 19 17:26 oldboy.txt

[root@test testdir]#

我们通过ls -l来查看oldboy.txt的属性,可以看到第一列的内容为-rw-r-r--,第一个符号-(英文字符减号),在Linux中,以这样的字符开头的文件就表示普通文件。

       这些文件一般使用相关的应用程序或系统命令创建,比如touchcptarechocat>>>等工具命令......。普通文件的删除可以使用rm命令;

 

普通文件(regular file):第一个属性为"-",按照文件内容,又可大略分为:

1)(纯)文本文件(ASCII):文件内容可以直接读取到数据,例如:字母、数字、特殊符号等。可以用cat命令读文件,比如配置文件一般都是这种类型的

2)二进制文件(binary):Linux中的命令程序就是属于这种格式。例如cat命令就是一个二进制文件。

3)数据格式的文件(data):有些程序在运行的过程中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件。例如:linux在登陆用户时,都会将登陆的数据巨鹿在/var/log/wtmplast命令的数据库文件)那个文件内,改文件是一个数据文件。通过last命令读取出来。cat命令读取会出现乱码。因为他属于一种特殊格式的文件。lastlog/var/log/atlog

 

2.2.2 【目录文件(directory)】

[root@test testdir]# ls -ld oldgirl/ scripts/

drwxr-xr-x. 2 root root 4096 Mar 22 02:49 oldgirl/

drwxr-xr-x. 2 root root 4096 Mar 21 10:00 scripts/

[root@test testdir]#

       如上,在oldboy目录下执行ls -ld查看目录名是,可以看到第一列的内容为drwxr-xr-x,这种开头带d字符的文件就表示目录,目录在Linux中是比较特殊的文件。

如果仅仅想看到目录属性时,可以使用ls的参数-d,搭配组合为ls -ld 目录名。

       创建目录的命令可以用mkdir命令或cp命令带参数(带-r-a),cp可以把整个目录复制为另一个目录。删除目录用rm -rrmdir(删空目录才可以)命令。

 

2.2.3 【字符设备或块设备文件】

在目录/dev/下:

[root@test testdir]# cd /dev/

[root@oldboyedu-35 dev]# ll -al /dev/tty

crw-rw-rw-. 1 root tty 5, 0 Mar 21 08:18 /dev/tty

[root@oldboyedu-35 dev]#

       /dev/tty属性是 crw-rw-rw- ,第一个字符是c,这表示字符设备文件。字符设备就是串行端口的解救设备,如猫等串口设备。

[root@oldboyedu-35 dev]# ll -al /dev/sda

brw-rw----. 1 root disk 8, 0 Mar 21 08:18 /dev/sda

[root@oldboyedu-35 dev]#

       /dev/sda的属性是brw-rw---- ,第一列的第一个字符是b,者表示块设备,块设备就是存储数据提供系统及程序访问的接口设备,如硬盘,光驱等都属于块设备;

 

       以上种类的文件,一般都可以用mkondmkond -make block or charater special files)来创建,用rm来删除。

 

2.2.4 【套接口文件】

当我们启动mysql服务时,会产生一个mysql.scok文件。这个文件的属性的第一个字符是s

 

       .scok文件也是一类特殊的文件,这类文件通常用在网络之间进程数据连接,如:我们可以启动一个程序来监听客户端的请求,在客户端可以通过套接字来进行数据通信。

 

2.2.5 【符号链接/软链接文件】

符号链接文件也被称为软链接文件。

[root@test testdir]# echo "I am a oldboy" > oldboy.txt

[root@test testdir]# # ln -s 给谁创建软链接(源文件) 软链接的名字(名字不能存在)

[root@test testdir]# ln -s oldboy.txt oldboy.txt_soft

[root@test testdir]# ll

total 16

-rw-r--r--. 1 root root   14 Mar 22 03:28 oldboy.txt

lrwxrwxrwx. 1 root root   10 Mar 22 03:31 oldboy.txt_soft -> oldboy.txt

drwxr-xr-x. 2 root root 4096 Mar 22 03:27 oldgirl

drwxr-xr-x. 2 root root 4096 Mar 21 10:00 scripts

drwxr-xr-x. 2 root root 4096 Mar 22 03:27 txtfile

[root@test testdir]#

如上所示,当我们查看文件属性时,会看到类似lrwxrwxrwx,第一个字符是l,这类文件标识链接文件(这里的是软链接文件)。

       可以通过ln -s 源文件 新文件名 创建(如果不使用-s,则会创建硬链接,但不适用于目录)。软链接的原理图如下:

 

 

2.2.6 【管道文件】

FIFO也是一个特殊的文件类型,主要是解决多个程序同时访问一个文件所造成的错误,第一个字符是pFIFOfifi - first-in first-out的缩写。

 

2.3 【文件扩展名】

Linux中虽然扩展名没有什么实际意义,但是为了兼容windows,同时,便于我们大多数习惯了windows的用户区分文件的不同,所以我们还是习惯通过扩展名来表示不同的文件类型。举例如下:

        .tartar.gztgztgztar.bz表示压缩文件,创建命令一般为targzipzip等。

    ②.sh表示shell脚本文件,通过shell语言开发的程序。

    ③.pl表示perl语言文件,通过Perl语言开发的程序。

    ④.py表示python语言文件,通过python语言开发的程序。

    ⑤.html.htm.jsp.do表示网页语言文件。

    ⑥.conf表示系统配置文件

    ⑦.rpm表示rpm安装包文件。

 

       补充:

       1)系统文件

扩展名

说明

.conf

一种配置文件。配置文件有时也有.cfg

.lock

锁(lock)文件:用来判定程序或设备是否正在被使用。

.rpm

Redhat 用来安装软件的软件包管理文件。

       2)压缩和归档文件

文件扩展名

说明

.bz2

.gz

.tar

.tbz

.rar

.zip

使用bzip2压缩的文件

使用gzip压缩的文件

使用tartap archive,磁盘归档的简写)

tarbzip压缩的文件

windows中常见,在linux中较少使用

MS-DOS中常见。Linux下使用gzip压缩,而.zip归档较少。

 

       3)编程和脚本文件

文件扩展名

说明

.c

.cpp

.h

.o

.pl

.py

.so

.sh

.java

.lcss

.ctl

C程序语言源码文件

C+程序语言的源码文件

CC++程序语言的头文件

程序的对象文件

Perl脚本

Python脚本

库文件

shell脚本

java程序源代码

java程序源代码编译后的中间代码文件

TCL脚本

 

3. 文件的权限

3.1 【文件权限概述】

Linux中的文件或目录权限和用户及用户组关系很大,要理解这部分内容,徐亚先了解Linux系统中用户管理方面额知识。

Linux中每个文件或目录都有一组9个基本权限位,每三个字符被分为一组,他们分别是属主权限位(占三个字符)、用户组权限位(占三个字符)、其他用户权限位(占三个字符)。比如rexr-xr-x,在Linux中正式这9个权限(更多权限位会在后面提到)位来控制文件属性、用户组以及其他用户的权限。如下图所示:

 

3.2 【权限位说明】

Linux文件或目录的权限室友9个权限位来控制,没三位为一组,文件的所有者权限:User Owner的读、写、执行,未见所有者属于的组的权限:Group用户组(Group)的读、写、执行,其他人Other其他用户的读、写、执行:

 

       rread)可读权限,对应数字4

       w(write)可写权限,对应数字2

       x(execute)可执行权限,对应数字1

-          没有任何权限,对应数字0

[root@test testdir]# ll -d /tmp /usr/bin/passwd `which locate` /bin/ls
-rwxr-xr-x. 1 root root    117048 May 11  2016 /bin/ls
drwxrwxrwt. 8 root root      4096 Mar 28 10:37 /tmp
-rwx--s--x. 1 root slocate  38464 Mar 12  2015 /usr/bin/locate
-rwsr-xr-x. 1 root root     30768 Nov 24  2015 /usr/bin/passwd
[root@test testdir]#

4. 链接

4.1 【链接的概念】

Linux系统中,链接可以分为两种:一种为硬链接(Hard Link,另一种为软链接或符号链接Symbolic Link or Soft Link or symlink)。ln命令用来创建链接文件,在默认不带参数的情况下,执行ln命令创建的链接是硬链接

4.2 【硬链接】

硬链接是指通过索引节点(Inode)来进行链接。在Linuxext2ext3ext4)文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Index Inode)简称Ionde,即在系统中文件的编号。(身份证号码

       Linux同一个文件系统中,多个文件名指向同一个索引节点inode号相同)(Inode)是正常且允许的。这种情况的文件就称为硬链接

       在同一个文件系统中(装修风格),多根文件的inode号码相同,这些文件就互为硬链接文件。

       硬链接文件就相当于文件的另一个入口。硬链接的作用是允许一个文件拥有多个有效路径名(多个入口相当于超市的多个门),这样用户就可以建立硬链接到重要的文件,防止“误删”元数据(很多硬件存储,如netapp存储中的快照功能就应用了这个原理,增加一个快照就多了一个硬链接)。

       Linux系统中,删除静态文件(没有进程调用)(目录也是文件)的调节是与之相关的所有硬链接文件均被删除(暂时可以这样理解)

 

       硬链接的创建:

              直接执行命令“ln 源文件(给谁创建硬链接 目标) 硬链接文件”

4.2.1 【目录的硬链接】

目录本身,以及目录下的"."目录都是其硬链接。

[root@oldboyedu-35 /]# ll -d /oldboydir/        #/oldboy目录两个硬链接
drwxr-xr-x. 2 root root 4096 Mar 23 14:22 /oldboydir/
[root@oldboyedu-35 /]# ll -d /oldboydir/ /oldboydir/.
drwxr-xr-x. 2 root root 4096 Mar 23 14:22 /oldboydir/
drwxr-xr-x. 2 root root 4096 Mar 23 14:22 /oldboydir/.
[root@oldboyedu-35 /]#

目录本身以及其下一级目录中的".."目录也属于其硬链接。(注意:目录的硬链接只能到其下一级目录

[root@oldboyedu-35 /]# mkdir /oldboydir/test/
[root@oldboyedu-35 /]# ll -d /oldboydir/        #/oldboy
目录有三个硬链接
drwxr-xr-x. 3 root root 4096 Mar 23 14:25 /oldboydir/
[root@oldboyedu-35 /]# ll -d /oldboydir/ /oldboydir/. /oldboydir/test/..
drwxr-xr-x. 3 root root 4096 Mar 23 14:25 /oldboydir/
drwxr-xr-x. 3 root root 4096 Mar 23 14:25 /oldboydir/.
drwxr-xr-x. 3 root root 4096 Mar 23 14:25 /oldboydir/test/..
[root@oldboyedu-35 /]#

4.2.2 【硬链接知识小结】

1)来源

        a)通过执行“ln 源文件(给谁创建硬链接 目标) 硬链接文件”,即可完成创建硬链接。

        b)在同一文件系统中,具有相同的inode节点的多个文件时互为硬链接文件

2)特点

        a)硬链接与删除

               i.删除硬链接文件或者删除源文件任何之一,文件实体(block数据 文件内容)并未被删除。

               ii.只有删除了源文件及所有对应的硬链接文件(硬链接数为0),文件实体(block 数据 文件内容)才会被删除。(暂不考虑进程调用)

               iii.当所有的硬链接文件被删除后,再存放新的数据占用这个文件的空间,或者磁盘fsck检查的时候,删除的数据也会被系统回收(养成删除及多套测试环境的好习惯)。

        b)硬链接文件就是文件的另一个入口(相当于超市的前后门一样)。

        c)可以通过给文件设置硬链接文件,来防止重要文件被误删。

        d硬链接文件普通文件,因此可以用rm命令删除。

        e)文件彻底删除:

               i.对于静态文件(没有进程正在调用的文件)来讲,当对应硬链接数0i_link),文件就被删除。

 

4.2.3 【查看文件的硬链接数】

1ls -lhi / stat, i_link的查看方法(ls -lhi结果的第三列就是)。

 

4.3 【软链接】

4.3.1 【软链接的概念】

软链接(Soft Link)也称为符号链接(Symbolic Link symlink)。Linux里的软链接文件就类似于windows系统中的快捷方式。linux里的软链接实际上是一个特殊的文件,文件类型是l。软链接实际上可以理解为一个文本文件,这个文件中包含有软链接指向另一源文件的位置信息内容,因此,通过访问这个“快捷方式”就可以迅速定位到软链接所指向的源文件实体。

 

       软链接的创建:

              执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接。

       误区:创建软链接源文件是需要存在的,要创建的软链接文件时不能存在的,是要用ln命令创建的。

 

4.3.2 【软链接知识小结】

1)创建:

       a)执行命令“ln -s 源文件 软链接文件”,即可完成创建软链接。

       2)含:

              a)软链接类似windows快捷方式(可以通过readlink查看其指向,ls -l)。

              b)软链接类似一个文本文件,里面存放的是源文件的路径/位置ls -l),指向源文件名/位置。

       3)特点:

              a)删除源文件,软链接文件依然存在,知识无法访问源文件(但是无妨访问指向源文件路径内容了)。

              b)失效的时候一般是白字红底闪烁提示。

              c)软链接和源文件是不同类型的文件,也是不同的文件。inode号码也不同。

       4)软链接文件的类型为"l(细目L",可以用rm命令删除。

4.4 【软连与硬链接的区别】

Linux系统中,链接分为两种:一种被称为硬链接(Hard Link),另一种被称为符号链接或软链接(Symbolic Link)。

4.4.1 【如何创建:】

1)默认不参数的情况下,ln命令创建的是硬链接,带参数-sln命令创建的是软链接

4.4.2 【含义:】

1)硬链接文件与源文件的inode节点号相同,而软链接相当于windows下面的快捷方式(inode节点号与原文件不同)。

4.4.3 【特点:】

       1不能对目录创建硬链接,但可以创建软链接,对目录的软链接经常会被用到。

       2)软链接可以跨文件系统,硬链接不可以跨文件系统。

4.4.4 【删除:】

1删除软链接文件,对源文件无任何影响;

2删除文件的硬链接文件,对源文件及软链接无任何影响;

3删除链接文件的源文件,对硬链接文件无影响,会导致软链接失效(红底白字闪烁状);

4同时删除源文件及其硬链接文件,整个文件才会被"真正"的删除

 

 

4.5 【企业案例】在配置Apache时,执行了./configure --prefix=/application/apache2.2.17来编译apache,在make instal完成后,希望用户的访问路径更简单,需要给/application/apache2.2.17目录做一个软链接/application/apache,使得内部开发或管理人员通过/application/apache就可以访问到apache的安装目录/appliction/apache2.2.17下的内容,请你给出实现的命令。(提示:apache为一个httpd web服务)

软件的安装位置 /application/apache2.2.17              给开发人员使用 /application/apache2.2.17

升级软件,新的软件安装位置    /application/apache2.4.17

 

 

 

[root@oldboyedu-35 /]# mkdir -p /application/apache2.2.17 /application/apache2.4.17

[root@oldboyedu-35 /]# ln -s /application/apache2.2.17/ /application/apache

[root@oldboyedu-35 /]# ll /application/

total 8

lrwxrwxrwx. 1 root root   26 Mar 21 21:23 apache -> /application/apache2.2.17/

drwxr-xr-x. 2 root root 4096 Mar 21 21:22 apache2.2.17

drwxr-xr-x. 2 root root 4096 Mar 21 21:22 apache2.4.17

[root@oldboyedu-35 /]# \rm -f /application/apache

[root@oldboyedu-35 /]# ln -s /application/apache2.4.17/ /application/apache

[root@oldboyedu-35 /]# ll /application/

total 8

lrwxrwxrwx. 1 root root   26 Mar 21 21:26 apache -> /application/apache2.4.17/

drwxr-xr-x. 2 root root 4096 Mar 21 21:22 apache2.2.17

drwxr-xr-x. 2 root root 4096 Mar 21 21:22 apache2.4.17

[root@oldboyedu-35 /]#

 

4.6 【链接总结】

4.6.1 【有关文件的链接小结】

①删除软链接文件对源文件及硬链接文件无任何影响;

②删除硬链接文件对源文件及软链接文件无任何影响;

③删除源文件,对硬链接文件没有影响,但会导致软链接文件失效,白字红底闪烁。

④同时删除源文件和硬链接(静态文件),文件会被真正删除。

4.6.2 【有关目录链接的小结】

①对于目录,不可以创建硬链接,但可以创建软链接。

②对于目录的软链接是生产场景运维中常用的技巧。

③由于目录的硬链接不能跨越文件系统(分区)(从硬链接原理理解)。

④每个目录下面都会有一个硬链接"."号,和对应上级目录的硬链接".."

⑤在父目录里面创建一个子目录,父目录的链接数增加1(每个子目录里面都有..来指向父目录)。但是再父目录里创建文件,父目录的链接数不会增加。

 

5.  文件的时间属性

5.1 【文件被修改或被访问的时间】

mitmemodify time):文件或目录的修改时间,文件内容修改。

ctimechange time):文件或目录属性的修改时间,大小,硬链接数,权限,所有者,所属于的组,类型。

atimeaccess time):文件或目录的访问时间,cat查看。

 

5.1.1 mitme

[root@test testdir]# stat oldboy.txt

  File: `oldboy.txt'

  Size: 246         Blocks: 8          IO Block: 4096   regular file

Device: 803h/2051d  Inode: 284823      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-03-24 09:16:43.329297303 +0800         #atime,查看文件内容后,改时间更新,有一定限制

Modify: 2017-03-24 09:16:30.982451900 +0800         #mtime,文件的内容修改后该时间才会更新

Change: 2017-03-24 09:16:30.982451900 +0800         #ctime,文件属性发生改变之后才会更新

[root@test testdir]#

 

[root@test testdir]# echo "modify time changed." >> /oldboy/oldboy.txt #修改文件内容

[root@test testdir]# stat oldboy.txt

  File: `oldboy.txt'

  Size: 267         Blocks: 8          IO Block: 4096   regular file

Device: 803h/2051d  Inode: 284823      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-03-24 09:16:43.329297303 +0800

Modify: 2017-03-25 11:39:07.776088559 +0800         #文件的mitme更新到最近一次修改内容的时间

Change: 2017-03-25 11:39:07.776088559 +0800

[root@test testdir]#

 

5.1.2 ctime

[root@test testdir]# stat oldboy.txt

  File: `oldboy.txt'

  Size: 246         Blocks: 8          IO Block: 4096   regular file

Device: 803h/2051d  Inode: 284823      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-03-24 09:16:43.329297303 +0800         #atime,查看文件内容后,改时间更新,有一定限制

Modify: 2017-03-24 09:16:30.982451900 +0800         #mtime,文件的内容修改后该时间才会更新

Change: 2017-03-24 09:16:30.982451900 +0800         #ctime,文件属性发生改变之后才会更新

[root@test testdir]#

 

 

[root@test testdir]# ln /oldboy/oldboy.txt oldboy.txt_link  #修改文件的硬链接数

[root@test testdir]# stat oldboy.txt

  File: `oldboy.txt'

  Size: 267         Blocks: 8          IO Block: 4096   regular file

Device: 803h/2051d  Inode: 284823      Links: 2

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-03-24 09:16:43.329297303 +0800

Modify: 2017-03-25 11:39:07.776088559 +0800

Change: 2017-03-25 11:42:21.192660572 +0800         #文件的ctime更新到最近一次修改文件属性的时间

[root@test testdir]#

 

5.1.3 atime

[root@test testdir]# stat oldboy.txt

  File: `oldboy.txt'

  Size: 246         Blocks: 8          IO Block: 4096   regular file

Device: 803h/2051d  Inode: 284823      Links: 1

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-03-24 09:16:43.329297303 +0800         #atime,查看文件内容后,改时间更新,有一定限制

Modify: 2017-03-24 09:16:30.982451900 +0800         #mtime,文件的内容修改后该时间才会更新

Change: 2017-03-24 09:16:30.982451900 +0800         #ctime,文件属性发生改变之后才会更新

[root@test testdir]#

 

 

[root@test testdir]# cat oldboy.txt         #查看文件内容

I am oldboy teacher!

I teach linux.

 

I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our site is http://www.etiantian.org

my qq num is 49000448.

 

not 4900000448.

my god ,i am not oldbey,but OLDBOY!

modify time changed.

[root@test testdir]# stat oldboy.txt

  File: `oldboy.txt'

  Size: 267         Blocks: 8          IO Block: 4096   regular file

Device: 803h/2051d  Inode: 284823      Links: 2

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2017-03-25 11:44:52.725757426 +0800     #atime更新到最近一次查看文件内容的时间,但是,atime改变有一定时间限制,不能短时间内多次修改

Modify: 2017-03-25 11:39:07.776088559 +0800                

Change: 2017-03-25 11:42:21.192660572 +0800

[root@test testdir]#

 

touch命令可以不修改文件内容来修改文件访问时间。


转载至http://blog.sina.com.cn/s/blog_bea8af1a0102xk4a.html

2017-02-12 10:23:05 erlang_hell 阅读数 701
  • Linux指令_文件权限的管理命令

    2.jeesite4.0 Eclipse 常用快捷键、 3.jeesite4.0文件结构与配置、 4.jeeiste4.0 内置模块与内置组件应用、 5.jeesite4.0代码生成器的应用、 6.jeesite4.0 Spring Boot快速入门、 7.jeesite4.0手机端基础接口文档。

    0课时 0分钟 148人学习 陈贺群
    免费试看

在Linux中,需要在C里面调用函数去检查文件状态。Linux中文件是否被修改过,我们可以通过读取文件属性,或者通过md5sum来检查文件是否被修改过。
这个代码是man 3 stat中的实例代码:

              #include <sys/types.h>
              #include <sys/stat.h>
              #include <dirent.h>
              #include <pwd.h>
              #include <grp.h>
              #include <time.h>
              #include <locale.h>
              #include <langinfo.h>
              #include <stdio.h>
              #include <stdint.h>

              struct dirent  *dp;
              struct stat     statbuf;
              struct passwd  *pwd;
              struct group   *grp;
              struct tm      *tm;
              char            datestring[256];

              /* Loop through directory entries. */
              while ((dp = readdir(dir)) != NULL) {

                  /* Get entry's information. */
                  if (stat(dp->d_name, &statbuf) == -1)
                      continue;

                  /* Print out type, permissions, and number of links. */
                  printf("%10.10s", sperm (statbuf.st_mode));
                  printf("%4d", statbuf.st_nlink);

                  /* Print out owner's name if it is found using getpwuid(). */
                  if ((pwd = getpwuid(statbuf.st_uid)) != NULL)
                      printf(" %-8.8s", pwd->pw_name);
                  else
                      printf(" %-8d", statbuf.st_uid);

                  /* Print out group name if it is found using getgrgid(). */
                  if ((grp = getgrgid(statbuf.st_gid)) != NULL)
                      printf(" %-8.8s", grp->gr_name);
                  else
                      printf(" %-8d", statbuf.st_gid);

                  /* Print size of file. */
                  printf(" %9jd", (intmax_t)statbuf.st_size);

                  tm = localtime(&statbuf.st_mtime);

                  /* Get localized date string. */
                  strftime(datestring, sizeof(datestring), nl_langinfo(D_T_FMT), tm);

                  printf(" %s %s\n", datestring, dp->d_name);
              }

阅读这个代码基本上能知道如何通过path将这个文件的属性抓取出来。关于文件信息(struct stat)的定义。

struct stat  
{  

    dev_t       st_dev;     /* ID of device containing file -文件所在设备的ID*/    
    ino_t       st_ino;     /* inode number -inode节点号*/    
    mode_t      st_mode;    /* protection -保护模式?*/    
    nlink_t     st_nlink;   /* number of hard links -链向此文件的连接数(硬连接)*/    
    uid_t       st_uid;     /* user ID of owner -user id*/    
    gid_t       st_gid;     /* group ID of owner - group id*/    
    dev_t       st_rdev;    /* device ID (if special file) -设备号,针对设备文件*/    
    off_t       st_size;    /* total size, in bytes -文件大小,字节为单位*/    
    blksize_t   st_blksize; /* blocksize for filesystem I/O -系统块的大小*/    
    blkcnt_t    st_blocks;  /* number of blocks allocated -文件所占块数*/    
    time_t      st_atime;   /* time of last access -最近存取时间*/    
    time_t      st_mtime;   /* time of last modification -最近修改时间*/    
    time_t      st_ctime;   /* time of last status change - 文件状态改变时间 */    
};  

如果是想检查文件是否被修改了,可以查看st_mtime这个时间戳是否有更改。是不是很简单。
在stat的返回值提到的信息:

Upon successful completion, 0 shall be returned. Otherwise, -1 shall be returned and errno set to indicate the error.

获取成功之后将会得到0,否则将会返回-1值,而且可以通过errno获取所指的具体错误。具体可能出现的问题有:

ERRORS
       The stat() function shall fail if:

       EACCES Search permission is denied for a component of the path prefix.

       EIO    An error occurred while reading from the file system.

       ELOOP  A loop exists in symbolic links encountered during resolution of the path argument.

       ENAMETOOLONG
              The length of the path argument exceeds {PATH_MAX} or a pathname component is longer than {NAME_MAX}.

       ENOENT A component of path does not name an existing file or path is an empty string.

       ENOTDIR
              A component of the path prefix is not a directory.

       EOVERFLOW
              The file size in bytes or the number of blocks allocated to the file or the file serial number cannot be represented correctly in the structure pointed to by buf.

       The stat() function may fail if:

       ELOOP  More than {SYMLOOP_MAX} symbolic links were encountered during resolution of the path argument.

       ENAMETOOLONG
              As a result of encountering a symbolic link in resolution of the path argument, the length of the substituted pathname string exceeded {PATH_MAX}.

       EOVERFLOW
              A value to be stored would overflow one of the members of the stat structure.

       The following sections are informative.

有一个重要的原则是,每个函数的返回值,其实都需要做关注。否则当出现的问题的时候,回头找中间的原因将会是一件很困难的事情。

       #include <string.h>

       char *strerror(int errnum);
       int dfd = open(argv[i], O_RDONLY);
        if (dfd == -1)
        {
            fprintf(stderr, "Failed to open directory %s for reading (%d: %s)\n",
                    argv[i], errno, strerror(errno));
            continue;
        }

这种写法将会有利于今后检查错误。通常狡猾的bug如同平时家里藏污纳垢之处,没有将事情明白交代清楚,最终都会害了自己。

接下来介绍通过md5sum来检查文件内容是否存在差异。这个就需要借助openssl库来将文件的全部的内存都读取出来,并且来计算即可。