Linux 文件管理是学习 Linux 的基础,看了鸟叔的 Linux 书籍,把 Linux 目录及文件相关的知识整理如下。
说明:文本的测试环境是 CentOS 7。
- 文件属性
1.1 基本概念
文件拥有者(Owner):在 Linux 中,每个用户都有自己的主文件夹,也就是 /home/user 文件夹,user 为具体的用户名,你就是这个文件夹下文件的拥有者,用户之间是无法查看的。
群组(Group):为了便于用户之间的合作交流,用户可以组成一个小团体,也就是群组。在这里大家可以共享一些文件,这些文件就是属于整个群组的。
其他(Other):对于群组之外的用户,都看作是其他人。
root 这个特殊用户在 Linux 中是天神一般的存在,因为它可以做到一切事情,当然也包括查看任何用户的主文件夹下的文件,而普通用户是无法查看 root 用户的主文件夹 /root 的。
在 Linux 系统当中,默认的情况下,系统上的所有帐号与一般身份使用者,还有 root 用户的相关信息, 都是记录在 /etc/passwd 这个文件内的。至于个人的密码则是记录在 /etc/shadow 这个文件中,但是密码都是经过算法加密的,即使是 root 用户也没法知道你的明文密码(查看加密算法可用 authconfig --test | grep hashing 命令)。 此外,Linux所有的群组名称都是记录在 /etc/group 文件内的。
1.2 文件属性
使用 root 用户登录,cd 切换到 /root 目录,输入 ls -al 列出目录下的所有的文件(包含隐藏文件)及属性,ls 是 list 列表的缩写,a 即是 attribute 属性的首字母,l 也是 list 的首字母。
![5763525-d04d90f702431827.png](https://i-blog.csdnimg.cn/blog_migrate/7583359ff8a9f97202067d0cbcb32f99.webp?x-image-process=image/format,png)
如上图,把文件的属性分为 7 列来看。
第一列为这个文件的类型与权限,共有十个字符,第一个字符为文件的类型,d 表示是目录(dictionary),- 表示是普通的文件,剩下的九个字符为文件的权限。权限位可分为三组,第一组为文件拥有者的权限,r 表示是可读(read),w 表示是可写(write),x 表示是可执行(execute);第二组为群组其他人的权限,- 表示没有该位的权限;第三组为群组外其他人的权限,Linux 中的文件权限控制就是通过这九个权限位来实现的。
说明:rwx 这三者对于文件和目录意思是不一样的。
对于目录来说,r 表示拥有此权限可以读取该目录的结构列表,即查看目录下的文件名和子目录名,但仅仅是文件名称,能不能查看文件内容,还需要看有没有文件的可读(r)权限;w 表示拥有此权限可以更改该目录的结构列表,即更改目录下的文件名或者子目录名,具体为新建文件或目录,删除已存在的文件或目录,文件或目录的重命名,文件或目录的移动。x 表示拥有此权限的用户可以进入该目录中,无法进入该目录便不能读取目录中文件中的内容,但是如果有目录的 r 权限,是可以查看文件及目录列表的,注意这两者的区别,x 是文件内容,r 是文件名称。所以如果要开放某一目录给任何人浏览,应该至少给予 r 和 x 权限。
对于文件来说,r 表示拥有此权限可以读取文件中的实际内容;w 表示拥有此权限可以修改文件中的内容,但不包括删除文件,删除文件权限是和文件所在目录的权限 w 有关的;x 表示拥有此权限可以执行文件,如一些命令文件。
![5763525-47d1f90c23cc9dea.png](https://i-blog.csdnimg.cn/blog_migrate/1829301e03d45d584c74b030705d137a.webp?x-image-process=image/format,png)
第二列为这个文件有多少的链接文件,可想象 Windows 下一个文件的快捷方式有多少个。
第三列为这个文件的拥有者账号。
第四列为这个文件的群组名称,账号名默认和群组名同名。
第五栏为这个文件的容量大小,默认单位为字节(Byte)。
第六栏为这个文件的创建日期或者是最近的修改日期,日期格式为月 日 时间,如果文件被修改的时间距离现在很久了,则只会显示年份。显示文件完整的日期,可使用 ls -l --full-time 命令。
第七栏为这个文件的文件名,文件前有 . 代表这个文件为隐藏文件。
1.3 更改文件或目录的属性及权限
root 用户可以更改任意文件或目录的属性,而普通用户只能更改自己主文件夹下的文件或目录的属性。
1.3.1 chmod 改变文件及目录权限
命令格式:chmod [-R] 权限写法 文件或目录,R 为可选参数,加上此参数表示同时递归改变目录下的所有子目录或文件的权限。
两种方式:
- 数字类型
使用数字来表示 rwx,r->4,w->2,x->1。对三组权限(Owner,Group,Other)设置,只需将三个数字累加起来,没有某一位权限,累加数字就为 0。
- 符号类型
使用符号 u,g,o 来代表 User(Owner),Group,Other,通过给这三个符号赋值(=),加入(+),除去(-) rwx 来设置权限,另外还可以使用 a 表示所有用户(All)来设置权限。
示例:
使用 root 用户在系统的根目录下,创建 test 文件,查看 test 文件夹设置的默认属性为 -rw-r--r-- 1 root root 日期 test。
cd / # 切换目录到根目录
touch test # 默认属性创建 test文件
ls -l test # 查看 test 文件夹属性
然后使用另外一个普通用户登录系统,打开该文件,但是由于只有只读属性,所以无法编辑这个 test 空白文件。
使用 root 用户,修改该文件的权限,使同群组的用户(Group)及其他用户(Other)可以编辑此文件。
命令1:
chmod 746 test # 修改 test 文件属性
命令2:
chmod g=rw,o=rw test # 使用重新赋值的方式设置权限,也可以将 g 和 o 连写 chmod go=rw test
命令3:
chmod g+w,o+w test # 使用加入新权限的方式设置权限,也可以将 g 和 o 连写成 chmod go+w test
命令4:
chmod a+w test # 直接使用 a 给所有用户加上 w 权限
给文件设置权限命令有很多种,只需选择一种即可。这样修改 test 文件的权限后,其他用户就可以编辑该文件了。
1.3.2 chown 改变文件及目录拥有者
命令格式:chown [-R] 用户名称[:群组名称] 文件或目录,R 为可选参数,加上此参数表示同时递归改变目录下的所有子目录或文件的拥有者。群组名称也可以通过 chown 命令修改,当然还可以通过下面的 chgrp 命令修改。
示例:
假如 root 用户将 test 文件复制一份给另一个普通用户 wzw,复制完后,test 副本的文件属性中,文件所有者和群组还是 root root,也就是复制操作会将原文件的文件属性也复制。那么 wzw 这个普通用户收到这个副本文件时,并不具有该文件的所有操作,如重新设置该副本文件的权限,所以 root 用户在将这个副本文件交给 wzw 这个用户之前,要将这个文件的拥有者修改为 wzw。
cp test test1 # 复制 test 文件为 test1 文件
ls -l test1 # 查看复制后的 test1 文件的属性,文件拥有者和群组仍为 root root
chown wzw test:test test1 # 将 test1 文件拥有者和群组都修改为 wzw 用户
ls -l test1 # 再次查看 test1 文件的属性,文件拥有者和群组已经修改为 wzw wzw
修改文件属性中群组也可以使用下面的 chgrp 命令。
1.3.3 chgrp 改变文件及目录群组
命令格式:chgrp [-R] 群组名称 文件或目录,R 为可选参数,加上此参数表示同时递归改变目录下的所有子目录或文件的拥有者。
示例:
将上面复制的文件 test1 群组设为已经存在的 root 群组和不存在的 test 群组,在 Linux 中,创建新用户后,默认还会创建对应的用户名称的群组。
chgrp root test1 # 将 test1 文件的群组属性设为 root 群组
ls -l test1 # 查看 test1 文件的属性,可以看到群组已经改为了 root,但文件的拥有者还是 wzw 没有变
chgrp test test1 # 将 test1 文件的群组属性设为 test 群组,会提示 test 是无效的组
chown 和 chgrp 命令都可以修改文件属性的群组,但是 chown 还可以设置文件的拥有者,这就是两者的区别。
- 目录配置
2.1 FHS 标准
由于 Linux 的发行版非常多,除了文本使用的 CentOS 外,常见的还有 Ubuntu,Debian,RedHat 等等。如果每个发行版的系统目录结构都不一样,那么就需要学习每个版本的 Linux,这肯定是我们不愿看到的,所以 Linux 社区就制定了文件系统层次结构标准,简称 FHS 标准。FHS 标准定义了 Linux 操作系统中主要目录及目录内容,大多数的 Linux 发行版都是遵从 FHS 标准并维护 FHS 的要求的。如今 FHS 标准也在不断的修订中。
2.2 目录说明
目录 说明
/ 整个文件系统层次结构的根目录
/bin 可执行文件(命令)目录,可以被root与一般用户使用,如 cat,chmod,mkdir 等常用命令
/sbin 开机、修复、还原系统所需要的指令目录,这些指令只有 root 才能够利用来“设置”系统,其他使用者最多只能用来“查询”
/boot 开机引导文件目录,如 Linux 的内核(kernel)文件名为 vmlinuz,开机管理程序 grub
/dev 存取设备目录。在 Linux 中,任何设备都是以文本形态存在于这个目录中的,如 cpu,disk 等
/etc 系统主要的配置文件目录,如前面提到的用户的密码信息。
/lib 系统函数库目录
/media 可移除的设备目录,如光盘,DVD
/mnt 暂时挂载的设备目录
/opt 第三方软件放置目录,如 KDE 桌面管理系统
/run 系统开机后所产生的各项信息放置目录,可以使用内存仿真
/srv 服务所需要取用的数据目录,如 WWW 服务,FTP 服务
/tmp 一般使用者或者是正在执行的程序暂时放置文件的目录,任何人都能够存取,重要的数据不可放置在此目录
/usr 软件资源所放置的目录,类似Windows 系统的 C:\Windows\ 和 C:\Program files\ 安装一些系统默认的软件或者一般的软件
/usr/bin 用户能够使用的指令目录
/usr/lib 类似于 /lib 目录
/usr/lib64 类似于 /lib64 目录
/usr/libexec 某些不被一般使用者惯用的可执行文件或脚本目录,如 X 图形窗口下面的操作指令
/usr/local 软件的安装目录
/usr/sbin 非系统正常运行所需要的系统指令,如某些网络服务软件的服务指令,基本功能和 /sbin 差不多
/usr/share 只读架构的数据文件和共享文件目录
/usr/games 与游戏比较相关的数据放置目录
/usr/include c/c++等程序语言的文件开始(header)与包含档(include)放置目录,当我们以t arball 方式 (*.tar.gz 的方式安装软件)安装某些软件时,会使用到里头的许多包含档
/usr/src 一般源代码建议放置目录
/home 使用者主文件夹目录。没创建一个新的使用者账号,便在该目录下创建一个和用户名称相同的文件夹
/lib64 用来存放与 /lib 不同的格式的二进制函数库,如支持 64 位的 /lib64 函数
/root 系统管理员(root)的主文件夹
/proc 虚拟文件系统目录,数据都是放在内存中的,而不占用任何的硬盘空间,如系统核心、行程信息,网络状态
/sys 虚拟文件系统目录,和 /proc 类似,同样也是不占用硬盘空间,主要也是记录核心与系统硬件信息较相关的信息
/var 经常性变动的文件目录,如高速缓存,登录文件以及软件运行中产生的文件,如 数据库文件
/var/cache 应用程序本身运行过程中会产生缓存文件目录
/var/lib 程序执行过程中数据文件放置的目录
/var/lock 文件锁目录,如共享锁,只能读取文件,不能修改文件
/var/log 登录文件放置的目录
/var/mail 个人电子邮件信箱放置的目录
/var/run 与 /run 类似
/var/spool 排队等待其他程序使用的数据目录,如工作调度数据
在 CentOS7 中,目录的编排与过去的版本不同,将许多原本放在根目录(/)中的目录,放到了 /usr 目录中了,然后只在根目录下加上目录的链接设置。包括下面这些:
- /bin -> /usr/bin
- /sbin -> /usr/sbin
- /lib -> /usr/lib
- /lib64 -> /usr/lib64
- /var/lock -> /run/lock
- /var/run -> /run
这样做带可以隐藏文件路径,增加权限安全,有节省存储的好处。
结合上面的目录,Linux 的目录树结构如下图所示。
![5763525-34916c5b34858047.png](https://i-blog.csdnimg.cn/blog_migrate/380bbbab6e5deb77c8d61696d8160e44.webp?x-image-process=image/format,png)
- 文件与目录管理
3.1 特殊目录与路径
3.1.1 特殊目录
- .:表示当前的目录,也可以使用 ./ 来表示。
- ..:表示上一级目录,也可以使用 ../ 来表示。
- -:表示前一个工作目录。
- ~:表示当前使用者的主文件夹,也即是 /home/user名。
- ~user名:表示 user 这个使用者的主文件夹。
3.1.2 特殊路径
- 绝对路径
一种从系统的根目录开始写起的路径表示方式,如 /home/wzw/Desktop
- 相对路径
一种以当前目录为相对位置的路径的表示方式,如当前在 /home/wzw/Download 目录中,想切换到 /home/wzw/Desktop 目录,只需要使用 cd ../Desktop 命令即可。
绝对路径写起来可能会比绝对路径,但具有绝对的正确性,而相对路径相比绝对路径更加的灵活,如在写程序时为了程序的可移植性,常使用相对路径来表示目录。
3.2 目录相关命令
3.2.1 切换目录
命令格式:cd 目录
cd 是 Change Dictionary 的缩写,目录可以为前面提到的特殊目录,使用绝对路径或者时相对路径表示。
示例:
cd / # 切换目录到根目录
3.2.2 显示当前目录
命令格式:pwd [-p]
pwd 是 Print Working Dictionary 的缩写,也就是显示当前所在的目录,p 参数是可以取得当前目录的真实目录,如链接的目录文件 /bin ,直接使用 pwd 命令,显示 /bin,但加上 P 参数,显示真实的目录为 /usr/bin。
示例:
cd /bin # 切换目录到 /bin
pwd # 显示当前目录为 /bin
pwd -P # 显示当前目录真实目录为 /usr/bin,CentOS7 下成立,其他版本 Linux 可能不成立哦
3.2.3 查看目录
命令格式:ls [-aAdfFhilnrRSt] 目录名称或者文件名、ls [--color={never,auto,always}] 目录名称或者文件名、ls [--full-time] 目录名称或者文件名
ls 这个命令的参数比较多,参数的详情可以使用 man 、 info 查看 ls 详细信息,或者查看 ls 的帮助ls -- help。
选项与参数:
-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
-A :全部的文件,连同隐藏文件,但不包括 . 与 .. 这两个目录
-d :仅列出目录本身,而不是列出目录内的文件数据(常用)
-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!)
-F :根据文件、目录等信息,给予附加数据结构,例如:
*:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;
-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来;
-i :列出 inode 数字,也即是链接到目录或者文件的数目
-l :长数据串行出,包含文件的属性与权限等等数据(常用)
-n :列出 UID 与 GID 而非使用者与群组的名称
-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小
-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
-S :以文件大小大小排序,而不是用文件名排序
-t :依时间排序,而不是用文件名
--color=never :不要依据文件特性给予颜色显示;
--color=always :显示颜色
--color=auto :让系统自行依据设置来判断是否给予颜色
--full-time :以完整时间模式 (包含年、月、日、时、分) 输出
--time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)而非内容变更时间 (modification time)
这些参数最常用的还是 l 参数,为了方面使用,很多 Linux 版本都给 ls -l 命令起了个别名 ll,两种命令是同样的作用。
3.2.4 创建新的目录
命令格式:mkdir [-mp] 目录名称
mkdir 为 Make Dictionary 的缩写,目录名称前可以加上目录位置,m 参数设置目录权限,不采用默认的目录权限(umask),p 参数递归创建所需的目录。
示例:
cd ~/Desktop # 切换用户的主文件夹下的桌面
mkdir test # 在桌面上创建 test 目录
mkdir -m 711 test0 # 创建 test0 目录,并给目录设置 rwx--x--x 权限
ls -ld test0 # 显示 test0 目录的属性
mkdir -p test1/test2/test3 # 创建多级目录,不加 p 参数,会提示没有此文件或目录,创建失败
ls -ld test* # 显示刚才创建的前缀为 test 目录的属性
3.2.5 删除空的目录
命令格式:rmdir [-p] 目录名称
rmdir 为 Remove Dictionary 的缩写,p 参数递归删除空目录。
示例:
mkdir test # 删除上面创建的 test 目录
mkdir -p test1/test2/test3 # 递归删除上面创建的 test1/test2/test3 目录
但是如果目录不为空,即目录内有内容,就不能使用 rmdir 删除目录,而要用 rm -r 命令删除。
命令格式:rm [-rf] 目录名称
r 参数是将目录下的内容一一询问是否要删除,在加上 f 参数则不询问直接强行删除。
示例:
mkdir test # 创建 test 目录
touch test/test.txt # 在 test 目录中创建 test.txt 文件
rm -rf test # 删除 test 目录及目录中的所有内容,如果直接 rmdir 删除,会提示删除失败,目录非空
3.3 文件相关命令
3.3.1 新建文件
命令格式:touch [-acdmt] 文件名称
一个文件在 Linux 中是有多个时间参数来记录时间相关的信息的。
- modification time (mtime): 当该文件的“内容数据”变更时,就会更新这个时间,内
容数据指的是文件的内容,而不是文件的属性或权限。 - status time (ctime): 当该文件的“状态 (status)”改变时,就会更新这个时间,像是权限与属性被更改了,都会更新这个时间。
- access time (atime): 当“该文件的内容被取用”时,就会更新这个读取时间(access)。举例来说,我们使用 cat 去读取一个文件时, 就会更新该文件的 atime 。
touch 命令不仅可以创建文件,还可以修改文件的时间信息,a 参数就是修改 atime 的;m 参数是修改 mtime 的;c 参数修改文件的时间,若该文件不存在则不创建新文件;d 参数是 date 简写,可以在后面直接加上时间参数。
3.3.2 复制文件
命令格式:cp [-adfilprsu] 来源文件 目标文件
选项与参数:
-a :相当于 -dr --preserve=all 的意思,至于 dr 请参考下列说明(常用)
-d :若来源文件为链接文件的属性(link file),则复制链接文件属性而非文件本身
-f :为强制(force)的意思,若目标文件已经存在且无法打开,则移除后再尝试一次
-i :若目标文件(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l :进行硬式链接(hard link)的链接文件创建,而非复制文件本身
-p :连同文件的属性(权限、用户、时间)一起复制过去,而非使用默认属性(备份常用)
-r :递回持续复制,用于目录的复制行为(常用)
-s :复制成为符号链接文件 (symbolic link),亦即“捷径”文件
-u :destination 比 source 旧才更新 destination,或 destination 不存在的情况下才复制
--preserve=all :除了 -p 的权限相关参数外,还加入 SELinux 的属性, links, xattr 等也复制了。
最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!
3.3.3 删除文件
在上面删除非空目录中提到的命令也同样适用于删除文件。
3.3.4 移动文件
命令格式:cp [--fiu] 来源位置 目标位置
f 参数为如果目标文件已存在,则不询问直接覆盖,i 参数为如果目标文件已存在,则询问是否覆盖,u 参数为如果目标文件已存在,但来源文件比较新,则更新目标文件为来源文件,另外此命令还可以用来重命名文件和目录。
3.3.5 查看内容
查看一个文件内容的命令很多,最常用的有 cat、more、less 等等,当然我们也可以直接在文本编辑器中,如vim(还有语法高亮)打开查看文件的内容。
- cat 是 Concatenate(连续)的简写,并不是“猫”的意思哦,cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒写。
- nl 显示的时候,顺道输出行号。
- more 一页一页的显示文件内容,空格键向下翻页,Enter 键向下滚动一行,/字符串,查询字符串。
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页,空格键向下翻页,pagedown 键向下翻动一页,pageup 向上翻动一页。
- head 只看头几行。
- tail 只看尾巴几行。
- od 以二进制的方式读取文件内容。
个人 GitHub 地址:https://github.com/weizhiwen,欢迎来访。