Linux操作系统学习(三)、Linux文件与目录管理

发布时间:2023年12月26日

Linux文件与目录管理

目录与路径

目录的相关操作

. 代表此层目录

… 代表上一层目录

- 代表前一个工作目录
代表“目前使用者身份”所在的主文件夹

~account 代表 account 这个使用者的主文件夹(account是个帐号名称)

无论在哪个目录中都存在:“.”,“…”这两个目录,分别代表本层与上一层的含义

在根目录中也存在 ”.“ ,“…” 这个两个目录,但这是两个目录的属性和权限一模一样,代表这是同一目录

常见处理目录的指令:

cd:变换目录

pwd:显示目前的目录(print working directory)

-P:会不以链接文件的数据显示,而是显示正确的完整路径

mkdir:创建一个新的目录

-m:设置文件的权限,而不使用默认umask的权限

-P:帮助你直接将所需要的目录(包含上层目录)递回创建起来

意思就是系统不能帮你连续创建类似 /test1/test2/test3/test4,但你使用-P指令就可以连续创建1234目录

rmdir:删除一个“空的”目录

-P:连同上层空的目录一同删除

-r:连同该目录和目录下的文件一块删除

Linux的默认命令行界面,具有文件补齐功能,使用[tab]按键来达成文件补齐

关于可执行文件路径的变量:$PATH

为什么在终端的任何情况下都可以使用 ls 这一个指令呢,因为是环境变量PATH的帮助所导致,分别查看PATH的设置路径

使用echo指令:

请添加图片描述

PATH这个变量的内容是由于一堆路径所构成,中间使用的:号隔开,无论在root或者用户模式下,都有/bin和/usr/bin这个目录存在,所以可以在任何地方使用ls指令

但是当我有两个ls指令在不同的目录,例如/usr/local/bin/ls与/bin/ls,那么当我下达ls指令时,哪个ls会率先执行?

答:使用echo查找${PATH}里面哪个目录先被查询,则那个目录的指令就会被率先执行。所以我使用的账号是erskine,最先搜索出来的是/usr/local/bin,所以/usr/local/bin/ls就会被先执行

  • 不同身份使用者默认的PATH不同,默认能够随意执行的指令也不同(如root与

    account);

  • PATH是可以修改的;

  • 使用绝对路径或相对路径直接指定某个指令的文件名来执行,会比搜寻PATH来的正确;

  • 指令应该要放置到正确的目录下,执行才会比较方便;

  • 本目录(.)最好不要放到PATH当中。

文件与目录管理

文件与目录的检视:ls

-a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)

-A :全部的文件,连同隐藏文件,但不包括 . 与 … 这两个目录

-d :仅列出目录本身,而不是列出目录内的文件数据(常用)

-f :直接列出结果,而不进行排序 (ls 默认会以文件名排序!)

-F :根据文件、目录等信息,给予附加数据结构,例如:

*:代表可可执行文件; /:代表目录; =:代表 socket 文件; |:代表 FIFO 文件;

-h :将文件大小以人类较易读的方式(例如 GB, KB 等等)列出来;

-i :列出 inode 号码,inode 的意义下一章将会介绍;

-l :长数据串行出,包含文件的属性与权限等等数据;(常用)

-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在帐号管理提到!)

-r :将排序结果反向输出,例如:原本文件名由小到大,反向则为由大到小;

-R :连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来;

-S :以文件大小大小排序,而不是用文件名排序;

-t :依时间排序,而不是用文件名。

–color=never :不要依据文件特性给予颜色显示;

–color=always :显示颜色

–color=auto :让系统自行依据设置来判断是否给予颜色

–full-time :以完整时间模式 (包含年、月、日、时、分) 输出

–time={atime,ctime} :输出 access 时间或改变权限属性时间 (ctime)

而非内容变更时间 (modification time)

通常情况下 ll 就相当于 ls -l的功能

复制、删除于移动:cp,rm,mv

  • cp(复制文件或目录)

[root@study ~]# cp [-adfilprsu] 来源文件(source) 目标文件(destination)

[root@study ~]# cp [options] source1 source2 source3 … directory

选项与参数:

-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 等也复制了。

最后需要注意的,如果来源文件有两个以上,则最后一个目的文件一定要是“目录”才行!

如果要去复制别人的文件,则该文件必须有read的权限才可以,并且一般来说复制的文件和源文件的权限是不同的,复制的文件的使用者往往是操作复制的人;

所以在我们进行备份的时候,若要复制特殊权限文件,例如密码档或者一些配置文件,不能直接用cp进行复制,而是使用cp -a或者-p 可以完整的复制文件的权限和属性

如果是目录则不能直接复制,要加上 -r 的选项,但是权限还是会修改

在复制时,必须要清楚:

是否需要完整的保留来源文件的信息?

来源文件是否为链接文件 (symbolic link file)?

来源文件是否为特殊的文件,例如 FIFO, socket 等?

来源文件是否为目录?

  • rm(移除文件或者是目录)

[root@study ~]# rm [-fir] 文件或目录

选项与参数:

-f :就是 force 的意思,忽略不存在的文件,不会出现警告讯息;

-i :互动模式,在删除前会询问使用者是否动作

-r :递回删除啊!最常用在目录的删除了!

使用万用字符 * 的帮忙,代表的是0到无穷多个任意字符

在删除目录时,若目录中没有文件则要使用rmdir指令,若目录中有文件就要使用rm -r

  • mv(移动文件与目录,或者更名)

[root@study ~]# mv [-fiu] source destination

[root@study ~]# mv [options] source1 source2 source3 … directory

选项与参数:

-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

-u :若目标文件已经存在,且 source 比较新,才会更新 (update)

该指令也可以用来修改名称

取得路径的文件名称与目录名称

[root@study ~]# basename /etc/sysconfig/network

network <== 很简单!就取得最后的文件名~

[root@study ~]# dirname /etc/sysconfig/network

/etc/sysconfig <== 取得的变成目录名了!

文件内容查询

直接检视文件内容:cat tac nl

cat 由第一行开始显示文件内容

[root@study ~]# cat [-AbEnTv]

选项与参数:

-A :相当于 -vET 的整合选项,可列出一些特殊字符而不是空白而已;

-b :列出行号,仅针对非空白行做行号显示,空白行不标行号!

-E :将结尾的断行字符 $ 显示出来;

-n :打印出行号,连同空白行也会有行号,与 -b 的选项不同;

-T :将 [tab] 按键以 ^I 显示出来;

-v :列出一些看不出来的特殊字符

tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!

nl 显示的时候,顺道输出行号!

[root@study ~]# nl [-bnw] 文件

选项与参数:

-b :指定行号指定的方式,主要有两种:

-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);

-b t :如果有空行,空的那一行不要列出行号(默认值);

-n :列出行号表示的方法,主要有三种:

-n ln :行号在屏幕的最左方显示;

-n rn :行号在自己字段的最右方显示,且不加 0 ;

-n rz :行号在自己字段的最右方显示,且加 0 ;

-w :行号字段的占用的字符数。

可检视翻页:more less

more 一页一页的显示文件内容

空白键 (space):代表向下翻一页;

Enter :代表向下翻“一行”;

/字串 :代表在这个显示的内容当中,向下搜寻“字串”这个关键字;

:f :立刻显示出文件名以及目前显示的行数;

q :代表立刻离开 more ,不再显示该文件内容。

b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。

less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

空白键 :向下翻动一页;

[pagedown]:向下翻动一页;

[pageup] :向上翻动一页;

/字串 :向下搜寻“字串”的功能;

?字串 :向上搜寻“字串”的功能;

n :重复前一个搜寻 (与 / 或 ? 有关!)

N :反向的重复前一个搜寻 (与 / 或 ? 有关!)

g :前进到这个数据的第一行去;

G :前进到这个数据的最后一行去 (注意大小写);

q :离开 less 这个程序;

数据摘取:head tail

head 只看头10行

head -n 20 xxx可以显示前20行的内容

tail 只看尾巴10行

tail -n 20 同理

非纯文本文件:od

od 以二进制的方式读取文件内容

[root@study ~]# od [-t TYPE] 文件

选项或参数:

-t :后面可以接各种“类型 (TYPE)”的输出,例如:

a :利用默认的字符来输出;

c :使用 ASCII 字符来输出

d[size] :利用十进制(decimal)来输出数据,每个整数占用 size Bytes ;

f[size] :利用浮点数值(floating)来输出数据,每个数占用 size Bytes ;

o[size] :利用八进位(octal)来输出数据,每个整数占用 size Bytes ;

x[size] :利用十六进制(hexadecimal)来输出数据,每个整数占用 size Bytes

修改文件时间或创建新文件:touch

其中三个时间参数:

mtime:指的是文件内容修改的最后时间

ctime:指的是文件权限修改的最后时间

atime:指的是文件被取用的最后时间(例如cat)

在默认的情况下:ls显示出来的时间戳是mtime

[root@study ~]# touch [-acdmt] 文件

选项与参数:

-a :仅修订 access time;

-c :仅修改文件的时间,若该文件不存在则不创建新文件;

-d :后面可以接欲修订的日期而不用目前的日期,也可以使用 --date=“日期或时间”

-m :仅修改 mtime ;

-t :后面可以接欲修订的时间而不用目前的时间,格式为[YYYYMMDDhhmm]

文件与目录的默认权限与隐藏权限

文件与目录的权限除了rwx以及是什么文件的属性之外,还了解了修改文件权限的chmod、chgrp、chown。

Linux在传统的Ext2/Ext3/Ext4文件系统下,还可以设置其他的文件属性(使用chattr设置隐藏属性,使用lsattr来查看)。

但是在xfs文件系统下的就没有支持chattr的参数了

练习:

  1. 你的系统有个一般身份使用者 dmtsai,他的群组属于 dmtsai,他的主文件夹在/home/dmtsai, 你是root,你想将你的 ~/.bashrc 复制给他,可以怎么做?

首先我是root,我的系统下有个文件.bashrc,然后复制给我的用户dmtsai的家目录下,就要用到cp

cp ~/.bashrc ~dmtsai/bashrc

然后因为cp不会修改权限,所以文件默认还是root用户,群组也是root,所以我们就要修改属性

chown dmtsai:dmtsai ~dmtsai/bashrc

用户dmtsai的家目录可以写做:~dmtsai

dmtsai:dmtsai表示使用和群组,之间用:隔开

  1. 我想在 /tmp 下面创建一个目录,这个目录名称为 chapter6_1 ,并且这个目录拥有者

    为 dmtsai, 群组为 dmtsai,此外,任何人都可以进入该目录浏览文件,不过除了 dmtsai 之

    外,其他人都不能修改该目录下的文件。

创建目录:mkdir -m 755 /tmp/chapter6_1

mkdir -m u+w,a+r,a+x, /tmp/chapter6_1 这个没用,群组也还是会访问

请添加图片描述

修改属性:chown dmtsai:dmtsai /tmp/chapter6_1

文件默认权限:umask

使用umask -S指令来查看,虚拟机下的文件默认权限:

请添加图片描述

可以看出umask的掩码为002,(一般只看最后三位)

也就是说:

当文件创建时默认为:666(rw-rw-rw-普通文件没有x权限)- 002 = 664:rw-rw-r–

当目录创建时默认为:777(rwxrwxrwx)- 002 = 775:rwxrwxr-x

如何修改umask呢: 直接输入umask xxx就可以

请添加图片描述

文件隐藏属性

下面的chattr指令只能在Ext2/Ext3/Ext4的 Linux 传统文件系统上面完整生效, 其他的文件系统可能

就无法完整的支持这个指令了,例如 xfs 仅支持部份参数而已。

请添加图片描述

文件特殊权限:SUID,SGID,SBIT

请添加图片描述

发现本该时x权限的竟然是 s,t权限,这是啥意思呢

我们知道/usr/bin/passwd的权限是root用户使用,但是account可以使用吗,答案是当然可以,因为我们有s权限,可以暂时使account获得root的权限从而修改密码。所以这个s就代表这SUID的功能:

SUID 权限仅对二进制程序(binary program)有效

执行者对于该程序需要具有 x 的可执行权限;

本权限仅在执行该程序的过程中有效 (run-time);

执行者将具有该程序拥有者 (owner) 的权限。

有些s存在于使用者的x权限位置,但有些s存在于群组的x权限位置,例如:

请添加图片描述

,那 s 在群组的 x 时则称为 Set GID, SGID

与 SUID 不同的是,SGID 可以针对文件或目录来设置

对于文件来说SGID具有如下的功能

SGID 对二进制程序有用;

程序执行者对于该程序来说,需具备 x 的权限;

执行者在执行的过程中将会获得该程序群组的支持!

若我使用 erskine 这个帐号去执行 locate 时,那 erskine 将会取得slocate 群组的支持, 因此就能够去读取 mlocate.db

对于目录来说SGID具有如下的功能

使用者若对于此目录具有 r 与 x 的权限时,该使用者能够进入此目录;

使用者在此目录下的有效群组(effective group)将会变成该目录的群组;

用途:若使用者在此目录下具有 w 的权限(可以新建文件),则使用者所创建的新文

件,该新文件的群组与此目录的群组相同。

SBIT是针对目录来使用的

当其他人的x位置权限更改成t时,称为SBIT权限

当使用者对于此目录具有 w, x 权限,亦即具有写入的权限时;

当使用者在该目录下创建文件或目录时,仅有自己与 root 才有权力删除该文件

例如:在/tmp的目录属性为 “drwxrwxrwt”,表示原来任何人可以都可以在该目录下添加和修改文件,但是,现在有t了,只能由本用户还有老大root来修改和删除本用户的文件和目录感觉就是变得更加的规范喽

如何设置SUID、SGID、SBIT呢

和权限数字更改差不多

SUID 4

SGID 2

SBIT 1

  • 若要设置 -rwsr-xr-x时,由于s在使用者权限中,所以时SUID,以前的权限是755,现在修改后就是4755,所以就是chmod 4755 filename

  • 而除了数字法之外,你也可以通过符号法来处理喔!其中 SUID 为 u+s ,而 SGID 为 g+s ,

    SBIT 则是 o+t

大写的S,T则是代表没有x的权限位,以前本身就没有x权限就更别提设置成s,t了

请添加图片描述
就像这样 0.o

观察文件类型:file

若你想要观察文件是什么类型的文件(ASCII、data、binary)
或者其中有没有用到动态函数库等等信息,就可以使用file
请添加图片描述
也可以拿来去判断是哪种格式的压缩包:

请添加图片描述

指令与文件的搜寻

指令的搜寻

类似于ls等指令的搜寻,我们可以查找ls被放在哪个文件夹里,通常我们使用which和type来搜寻

  • which(寻找 可执行文件)

-a 可将所有包含该指令的文件统统列出来,而不只是第一个被找到的指令

有些指令通过例如history,通常which找不到,因为history是“bash 内置的指令

which默认的是寻找PATH内所规范的目录

文件名的搜索

  • whereis(由一些特定的目录中寻找文件文件名

whereis主要是针对/bin/sbin下面的可执行文件

以及/usr/share/man下面的man page文件

[root@study ~]# whereis [-bmsu] 文件或目录名

选项与参数:

-l :可以列出 whereis 会去查询的几个主要目录而已

-b :只找 binary 格式的文件

-m :只找在说明文档 manual 路径下的文件

-s :只找 source 来源文件

-u :搜寻不在上述三个项目当中的其他特殊文件

对于find来说是直接搜寻硬盘

  • locate/updatedb

locate 寻找的数据是由“已创建的数据库 /var/lib/mlocate/” 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据

[root@study ~]# locate [-ir] keyword选项与参数:

-i :忽略大小写的差异;

-c :不输出文件名,仅计算找到的文件数量

-l :仅输出几行的意思,例如输出五行则是 -l 5

-S :输出 locate 所使用的数据库文件的相关信息,包括该数据库纪录的文件/目录数量等

-r :后面可接正则表达式的显示方式

撰写不易,留下您的关注和点赞,我们一起进步!
在这里插入图片描述

文章来源:https://blog.csdn.net/weixin_45241469/article/details/135227335
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。