Linux 文件
基本属性
Linux 系统是一种典型的多用户系统,为了保护系统的安全性,不同的用户拥有不同的地位和权限。Linux 系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定。
可以使用命令:ll 或 ls –l 来显示一个文件的属性以及文件所属的用户和组,如图所示:
详细解析命令:ls -l 中显示的内容
使用命令:ll 或 ls –l 时,会显示一个文件的属性以及文件所属的用户和组等信息,对这些信息详细解析,如下所示:
drwxr-xr-x. 3 root root 101 9月 8 01:52 abrt
如图所示:从左至右的 10 个字符中,第 1 个字符确定文件类型,接下来的字符中,以三个为一组,均为 rwx 的三个参数的组合。
第 1 个字符确定文件类型,类型有如下几种:
- d 表示目录;
- - 表示文件;
- l 表示为链接文档(link file);
- b 表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- c 表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
第 2-4 位确定属主(该文件的所有者)拥有该文件的权限。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 需要注意的是,这三个权限的位置不会改变,如果没有权限,就会显示为减号 - 。
第 5-7 位确定属组(所有者的同组用户)拥有该文件的权限。
第 8-10 位确定其他用户拥有该文件的权限。
第 10 个字符之后的字符的意义可参考上面那张图,这里不再赘述。
文件的属主和属组
在Linux系统中,文件都有一个特定的所有者,也就是对该文件具有所有权的用户。同时,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为 "文件所属组的同组用户" 和 "其他用户"。因此,Linux系统按 "文件所有者"、"文件所有者同组用户" 和 "其他用户" 来规定了不同的文件访问权限。
drwxr-xr-x. 3 root root 101 9月 8 01:52 abrt
在上面的实例中,abrt 文件是一个目录文件,属主和属组都为 root,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。
但对于 root 用户而言,一般情况下,文件的权限对其不起作用。
更改文件属性
Linux 中通常使用以下两个命令来修改文件或目录的所属用户与权限:
- chown (change owner) : 修改所属用户与组。
- chmod (change mode) : 修改用户的权限。
chgrp(change group)
用于变更文件或目录的所属群组。语法:
chgrp [ * ] [--help] [--version] 属组名 文件或目录
chgrp [ * ] [--help] [--reference=<参考文件或目录>] [--version] 文件或目录
[ * ] 参数说明:
- -c 或 --changes:效果类似"-v"参数,但仅回报更改的部分。
- -f 或 --quiet 或 --silent: 不显示错误信息。
- -h 或 --no-dereference: 只对符号连接的文件作修改,而不改动其他任何相关文件。
- -R 或 --recursive: 递归处理,将指定目录下的所有文件及子目录一并处理。
- -v 或 --verbose: 显示指令执行过程。
[ --help ] 参数说明: --help:在线帮助。
[--version] 参数说明:--version:显示版本信息。
[--reference=<参考文件或目录>] 参数说明:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
实例1,改变/etc/chen目录下文件hello.cpp的群组属性:
实例2,根据指定文件改变文件的群组属性:
chown(change owner)
设置文件所有者和文件关联组的命令。语法:
chown [ * ] [--help] [--version] 属主名 文件名
chown [ * ] [--help] [--version] 属主名:属组名 文件名
[ * ] 参数说明:
- -c : 显示更改的部分的信息
- -f : 忽略错误信息
- -h :修复符号链接
- -v : 显示详细的处理信息
- -R : 处理指定目录以及其子目录下的所有文件
[ --help ] 参数说明: --help : 显示辅助说明
[ --version ] 参数说明: --version : 显示版本
例如,进入 /etc/chen目录,将hello.cpp的拥有者和群组改为chen这个账号:
chmod(change mode):
更改Linux 文件的 9 个基本属性(分别是 owner(属主)/group(属组)/others(其他) 三种身份各自的 read(读)/write(写)/execute(执行) 权限)。属性有两种设置方法,一种是数字,一种是符号。
数字类型改变文件权限
文件的权限字符为: -rwxrwxrwx , 这九个权限是三个三个一组的!因此,可以使用数字来代表各个权限,各权限的分数为:r(4)、w(2)、x(1),将各组的权限(r/w/x)分数累加起来。例如,当权限为: -rwxrwx--- ,那么分数则是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= --- = 0+0+0 = 0
所以,使用数字更改文件权限时,该文件的权限数字xyz就是 770,此时,指令 chmod 的语法为:
chmod [ * ] [--help] [--version] xyz 文件或目录
xyz : 数字类型的权限属性(比如:770)。
[ * ] 参数说明:
- -c : 若该文件权限确实已经更改,才显示其更改动作
- -f : 若该文件权限无法被更改也不要显示错误讯息
- -v : 显示权限变更的详细资料
- -R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
[--help] 参数说明:--help : 显示辅助说明
[--version] 参数说明:--version : 显示版本
例如, 将目录/etc/chen下的文件hello.cpp的所有的权限都设定为启用,那么权限的分数就成为 [4+2+1][4+2+1][4+2+1]=777:
符号类型改变文件权限
使用 u, g, o 分别代表三种身份:user(用户)、group(组)、others(其他)的权限,此外, a 代表 all,即全部的身份。
读、写、执行的权限可以写成 r, w, x,也可使用+(增加权限)、-(取消权限)、=(唯一设定权限)将权限去掉而不改变其他已存在的权限。如下图所示:
例如, 目录/etc/chen下的文件hello.cpp权限设置为: -rwxr-xr-- ,可以使用命令:chmod u=rwx,g=rx,o=r hello.cpp 来设定:
例如, 使用-(除去)将全部人的可执行权限去掉而不改变其他已存在的权限:
Linux 目录管理
Linux 的目录结构为树状结构,最顶级的目录为根目录 /。其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们。
绝对路径与相对路径
-
绝对路径:路径的写法,由根目录 / 写起,例如: /etc/chen 这个目录。
-
相对路径:路径的写法,不是由 / 写起,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: cd ../man 这就是相对路径的写法。
处理目录的常用命令
几个常见的处理目录的命令:
- ls(list files): 列出目录及文件名
- cd(change directory):切换目录
- pwd(print work directory):显示目前的目录
- mkdir(make directory):创建一个新的目录
- rmdir(remove directory):删除一个空的目录
- cp(copy file): 复制文件或目录
- rm(remove): 删除文件或目录
- mv(move file): 移动文件与目录,或修改文件与目录的名称
注:可以使用:man [命令] ,帮助查看各个命令的使用文档,如 :man cp。
ls
列出目录。语法:
ls [选项] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
[ 选项 ] 参数说明:
- -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
- -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
- -l :长数据串列出,包含文件的属性与权限等等数据;(常用)
- -r 逆序排列。
- -t 按时间信息排序。
- -u 使用最近访问时间代替最近修改时间为依据来排序(使用 “ -t ”选项时)或列出(使用“ -l ”选项时)。
[ --color={never,auto,always} ] 参数说明:指定是否使用颜色区别文件类别。
[ --full-time ] 参数说明:列出完整的时间,而不是使用标准的缩写。
例如:将目录/etc下的所有文件列出来(含属性与隐藏档)
cd
变换工作目录的命令。语法:
cd [相对路径/绝对路径]
例如,使用绝对路径切换到/etc/chen/documents目录
使用相对路径切换到 documents 目录
pwd
pwd 是 Print Working Directory 的缩写,显示目前所在目录。语法:
pwd [-P]
[ -P ] 参数说明:显示出确实的路径,而非使用链接 (link) 路径。
例如, 命令:pwd 显示出当前实际的工作目录,而非链接档本身的目录名:
而且/var/mail是一个链接档,链接到 /var/spool/mail 。因此,使用命令:pwd -P 后,会不以链接档的数据显示,而是显示正确的完整路径
mkdir
mkdir 是 make directory 的缩写,创建新的目录。语法:
mkdir [选项] 目录名称
[ 选项 ] 参数说明:
- -m :配置文件的权限;
- -p :将所需要的目录(包含上一级目录)递归创建起来!
例如, 目录/etc/chen 底下创建数个新目录:
加入选项 -p ,创建多层目录
创建权限为 r-xr-xr-x 的目录。需要使用选项 -m 。如果没有加上 -m 来强制配置属性,系统会使用默认属性。
rmdir
删除空的目录。语法:
rmdir [选项] 目录名称
[ 选项 ] 参数说明:
- -p :从该目录起,一次删除多级空目录
例如, 删除目录/etc/chen/tmp 底下的空目录 test ,以及非空目录test1。
cp
拷贝文件和目录。语法:
cp [ 选项 ] 来源档(source) 目标档(destination)
cp [ 选项 ] source1 source2 source3 .... directory
[ 选项 ] 参数说明:
-a:复制时,尽可能保持文件的结构和属性.(但不保持目录结构)等同于 -dpR。(常用)
-d:若来源档为链接档的属性(link file),则复制链接档属性而非文件本身;
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式链接(hard link)的链接档创建,而非复制文件本身;
-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
-r:递归持续复制,用于目录的复制行为;(常用)
-s:复制成为符号链接档 (symbolic link),亦即『捷径』文件;
-u:如果存在的目标档有相同的,或者更新的修改时间,不复制目录(文件).
例如, 将 /etc/chen 目录下的 test.c 复制到 /home/chen 下,并命名为 hello.c
rm
移除文件或目录。语法:
rm [ 选项 ] 文件或目录
[ 选项 ] 参数说明:
- -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
- -i :互动模式,在删除前会询问使用者是否动作
- -r :递归删除!最常用在目录的删除中!慎用!
例如, 将/home/chen 下的 hello.c删除掉!加上 -i 选项会显示询问:
mv
移动文件与目录,或修改名称。语法:源文件
mv [ 选项 ] 源文件(source) 目标文件(destination)
mv [ 选项 ] source1 source2 source3 .... 目录(directory)
[ 选项 ] 参数说明:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- -u :若目标文件已经存在,且 source 比较新,才会升级 (update)
例如, 将 /home/chen 目录下的 tmp 移动到 /etc/chen 下
将 /etc/chen 目录下的 hello.cpp 移动到 /home/chen 下,并更名为 test.cpp
Linux 内容查看
使用以下命令查看文件的内容:
- cat:由第一行开始显示文件内容
- tac:从最后一行开始显示
- nl:显示的同时,输出行号
- more:一页一页的显示文件内容
- less:与 more 类似,且可以往前翻页!
- head:只看头部几行
- tail:只看尾部几行
可以使用命令:man [命令] 来查看各个命令的使用文档,如 :man cp。
cat
由第一行开始显示文件内容。语法:
cat [ 选项 ] [ 文件 ]
[ 选项 ] 参数说明:
- -A :相当于 -vET 的整合选项,show-all,可列出一些特殊字符而不是空白而已;
- -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
- -E :将结尾的断行字节 $ 显示出来;
- -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
- -T :将 [tab] 符号以 ^I 显示出来;
- -v :除了 LFD 和 TAB 之外所有控制符用 ^ 和 M- 记方式显示。
例如, 查看 /etc/profile 这个文件的内容:
tac
tac与cat命令作用结果刚好相反,文件内容从最后一行开始显示。如,查看 /etc/profile 这个文件的内容:
nl
显示行号。语法:
nl [ 选项 ] [ 文件 ]
[ 选项 ] 参数说明:
- -b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值);- -n :列出行号表示的方法,主要有三种:
-n ln :行号在荧幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ;- -w :行号栏位的占用的位数。
例如, 用 nl 列出 /etc/profile 的内容
more
一页一页翻动。例如,查看 /etc/profile 这个文件的内容:
底部会显示:--More--(**%) 字样,more 仍在运行过程中,表示等待你的命令,此时有几个按键可以按的:
- 空白键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
- :f :立刻显示出档名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less
一页一页翻动,以下实例输出/etc/chen/test.c 文件的内容:
[chen@localhost chen]$ less /etc/chen/test.c
less运行时可以输入的命令有:
- 空白键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字串 :向下搜寻『字串』的功能;
- ?字串 :向上搜寻『字串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- q :离开 less 这个程序;
head
取出文件前面几行。语法:
head [-n number] 文件
[-n number] 参数说明:
- -n :后面接数字,代表显示几行的意思。默认的情况中,显示前面 10 行!
例如,输出4行/etc/chen/test.c 文件的内容:
tail
取出文件后面几行。语法:
tail [-n number] 文件
[-n number] 参数说明:
- -n :后面接数字,代表显示几行的意思
- -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测
例如,输出文件/etc/chen/test.c 后面4行的内容:
Linux 链接
Linux 链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln 命令产生硬链接。
硬连接
硬连接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。
比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
软连接
另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含有另一文件的位置信息。
比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
实例
从上面的结果中可以看出,硬连接文件 f2 与原文件 file1 的 inode 节点相同,均为 3291628,然而符号连接文件的 inode 节点不同。
注:-i参数显示文件的inode节点信息。
上面的测试可以看出:当删除原始文件 file1 后,硬连接 file2 不受影响,但是符号连接 file3 文件无效。