Linux学习第四天-Linux文件与目录管理

1.目录与路径

1.1 绝对路径与相对路径
绝对路径:路径的写法一定由根目录写起,例如:/user/share/doc这个目录;
相对路径:路径的写法不是由/写起,比如由/user/share/doc要到/user/share/man底下时,可以写成【cd …/man】这就是相对路径。
穿插cd的用法,cd=change diretory

  • 相对路径的用途
    假设你写了一个软件,共需要三个目录,分别是etc,bin,man,然而由于不同的人喜欢安装在不同的目录中,假设甲安装的目录是/usr/local/packages/etc, user/local/packages/bin 及/user/local/packsges/man,而乙喜欢安装在/home/packages/etc, /home/packages/bin及/home/packages/man这三个目录中,此时用相对路径就比较好切换罗!

  • 绝对路径的用途
    正确度要比较好,一般情况下,如果是在写程序管理系统的条件下,务必使用绝对路径的写法。

1.2目录的相关操作

. : 一个点代表当前的目录,也可以用 ./来表示。
… :两个点代表上一层目录,也可以用…/来表示。
-:横线代表前一个工作目录。
~:代表目前用户身份所在的家目录。
~account:代表account这个用户家目录(account是个账号名称)。
对于根目录,上一层(…)与根目录自己(.)是同一个目录。

关于目录的几个指令:

  • cd (change directory)变换目录
    在这里插入图片描述在这里插入图片描述在刚登陆的时候,会到自己的家目录中,而且家目录还有一个代码,就是【~】符号。

  • pwd (显示目前所在的目录)print working directory
    pwd -P 加上-P的选项后,会不以链接文件的数据显示,而是显示出正确的完整的路径。

  • mkdir (建立新目录) make directory
    加上-m :配置文件的权限,直接设定,不需要看预设权限(umask)的脸色,例如mkdir -m 711 test2;
    -p:帮助你直接将所需要的目录(包含各上层目录)递归建立起来。

  • rmdir (删除空的目录)remove directory
    如果需要将目录下所有东西都删掉,可以用 【rm -r test 】
    同样的可以加入-p选项来删除上层的目录。

2.文件与目录管理

2.1 文件与目录的检视:ls
在这里插入图片描述2.2 复制、删除与移动:cp,rm,mv

  • 复制文件:cp (copy)

在这里插入图片描述cp复制过程中来源档和目的档的权限是不同的,目的档的拥有者会是指令操作者本身。举例,如果使用root的身份去copy一个file,这个file的owner就变成了root,这样一些密码等配置文件或者需要特别注意的特殊权限文件就不能用cp来复制。
对于source file,如果是复制一个目录,那么对应的target 也应该是一个目录文件,此时我们需要加上-r这个选项用于复制目录,但是文件与目录的权限可能会被改变,所以一般使用-a这个选项来备份文件,保证两份文件内容完全一致。

  • rm 移除文件或目录(remove)
    选项与参数:-f:就是force的意思,忽略不存在的文件,不会出现警告信息;
    -i:互动模式,会询问使用者是否动作;
    -r: 递归式删除,最常用在目录的删除了,是非常危险的选项!
    另外注意文档名尽量不要使用“-”作为首字符,很容易造成系统误判。

  • mv 移动文件与目录名或者更名 move
    mv [-fiu] source destination
    mv [option] source1 source2 source3 … directory
    选项与参数:
    -f : force 强制的意思,如果目标文件已经存在,不会询问直接覆盖;
    -i: 若目标文件已经存在,会询问是否覆盖;
    -u:若目标文件已经存在,且源文件比较新,才会更新。
    mv也可以对文件进行重命名。

2.2 取得路径的文件名与目录名称
在Linux系统中,每个档名的长度都可以达到255个字符。
在这里插入图片描述basename/dirname :取得文件名或者目录名

3.文件内容查阅

cat 从第一行开始显示文件内容
tac 从最后一行开始显示,可以看出tac是cat的倒着写
nl 显示的时候 顺便输出行号
more 一页一页的显示文件内容
less与more 类似,但是比more更好的是,他可以往前翻页
head 只看头几行
tail 只看末尾几行
od 以二进制的方式读取文件内容

3.1 直接检视文件内容
直接查阅一个文件的内容可以用cat/tac/nl这几个指令啊
cat(concatnate)连续 :将一个文件连续印出在屏幕上。加上-n或者-b选项,在前面还会加上行号呢
tac 从最后一行反向显示在屏幕上
nl 添加行号打印
3.2 可翻页检视
more(一页一页翻动)
在这里插入图片描述less (一页一页翻动)
在这里插入图片描述3.3 资料摘取

head [-n number] 文件 -n后面接数字,代表显示几行的意思。默认的话显示前面10行,若只要一行,加入【head -n filename】即可。但如果后面100行的数据都不打印,只打印前几行,可以下达【head -n -100 filename】的指令。
tail [-n number] 文件 -n后面接数字,代表显示几行的意思。-f表示持续侦测后面所接的文档名,要等按下ctrl+C键才会结束tail的侦测。(由于文件随时都会有数据写入,如果你想要该文件有数据写入时就立即显示到屏幕上,就利用-f这个选项)

问题:如果我想显示某文件的第11行到第20行呢?思路为取前20行,再取后10行,结果就是【head -n 20 filename | tail n 10】。
在这两个指令之间有个管线(|)的存在,意思是:前面的指令所输出的信息,请透过管线交由后续的指令继续使用的意思。因此,head指令会将文件内的前20行取出来,但不输出到屏幕上,而是转交给后续的tail指令继续使用。tail指令不需要加上文档名,是因为tail所需要的数据是来自于head处理后的结果。
承接上题,如果我还想标个行号呢?命令为【cat -n filename | head -n 20 | tail -n 10】

3.4 非纯文本档 od
od 以二进制的方式读取文件 加上-t c的选项参数来将数据内的字符以ASCII类型来显示。例如找到password这几个字的ASCII的对照。
在这里插入图片描述
3.5修改文件时间或建置新档 touch

每个文件在Linux下面都会记录许多时间参数,其实是三个主要的变动时间,分别是:

  • modification time(mtime):当该文件的内容数据变更时,就会更新这个时间。内容数据指的是文件内容,而不是文件属性或权限哈。
  • status time(ctime):当该文件状态改变时,就会更新这个时间。比如说,权限与属性被更改了,就会更新这个时间。
  • access time(atime): 当文件的内容被取用时,就会更新这个读取时间长(access),比如我们用cat这个指令读取文件时,就会更新该文件的atime了。
    在默认情况下,ls指令显示的是mtime。
    touch 最常使用的两种情况,1.建立一个新文件;2.修改文件的atime 和 mtime。选项与参数如下:
    -a:仅修订access time。
    -c:仅修改文件的时间,若该文件不存在则不建立新文件。
    -d:后面可以接想修订的日期而不用目前的日期,也可以使用–date=的指令。
    -m: 仅修改mtime。
    -t:后面可以接想修订的时间而不用目前的时间,格式为 [YYYYMMDDhhmm]

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

4.1 文件预设权限 umask
在这里插入图片描述如上图所示,输入umask指令,则会看到目前用户在建立文件或目录的时候的权限默认值。并且需要注意的是,umask的分数值是指该默认值需要删掉的权限
在默认权限的属性上,目录与文件是不一样的,x权限对目录是非常重要的,但是一般文件的建立则不应该有执行的权限,因此预设的情况如下:

  • 若使用者建立为文件则预设没有可执行(x)的权限,只有rw这两个项目,最大即为666分,预设权限为:-rw-rw-rw-
  • 若用户建立为目录,则由于x与是否可以进入此目录有关,默认所有权限都开放,即为777分,预设权限为:drwxrwxrwx

4.2 文件隐藏属性
4.3 文件特殊权限 SUID, SGID,SBIT
Set UID
在Linux中还有一个特殊权限(s和t),当s这个标志出现在文件拥有者权限上,比如/user/bin/passwd这个文件的权限为[-rwsr-xr-x],此时就被称作Set UID,简称为SUID的特殊权限。SUID的特点有:

  • SUID权限仅对binary program有效不能用于shell script上,shell script只是很多binary执行档叫来执行而已,因此SUID的权限部分,还是要看shell script呼叫进来的程序的设定,当然SUID对于目录也是无效的
  • 执行者对该程序要具有x的可执行权限;
  • 本权限仅在执行该程序的过程中有效;
  • 执行者将具有该程序拥有者(owner)的权限。

举个例子来说明,我们Linux系统中,所有账号的密码都记录在/etc/shadow这个文件里,这个文件的权限为【----------1 root root】,意思是这个文件只有root可读且仅有root可以强制写入。那我们自己设的一般账号怎么自行修改自己的密码呢,可以输入【passwd】这个指令看看,就能修改了。因为我们的账号(一般用户)对/user/bin/passwd这个文件有x权限,表示可以执行passwd;passwd的拥有者是root 这个账号;一般用户执行passwd过程中,会暂时获得root 的权限,那么/etc/shadow就可以被一般用户所执行的passwd所修改。但如果使用cat去读取/etc/shadow是不可行的,因为cat不具备SUID权限。

Set GID
s标志在文件拥有者的x项目为SUID,那s在群组的x则称为Set GID,SGID,例如-rwx–s--x。
与SUID不同的是,SGID可以针对文件或目录来设定,功能如下:

  • SGID对二进制程序有用;
  • 程序执行者对于该程序来说,需要具备x的权限;
  • 执行者在执行的过程中将会获得该程序群组的支持。

Sticky Bit
Sticky Bit, SBIT目前只针对目录有效,对于目录的效果是:

  • 当用户对于此目录具有w,x权限,亦具有写入的权限时;
  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权利删除该文件。

SUID/SGID/SBIT权限设定

  • 数字法:4为SUID;2为SGID;1为SBIT;
  • 符号法:u+s为SUID;g+s为SGID;o+t为SBIT

4.4 观察文件类型 file

file指令,简单预判文件格式,包括在下面我们提到使用tar包裹时,该tarball文件是使用哪一种压缩功能。

5 指令与文件的搜寻

5.1 脚本文件名的搜寻
which (寻找执行档)
which [-a] command -a选项:将所有有PATH目录中可以找到的指令均列出,而不止第一个被找到的指令名称。
但是我们在用which找history指令时,并没有找到,原因是history是bash 内建的指令,而which预设是找PATH内所规范的目录,所以当然找不到啦。

5.2 文件档名的搜寻
whereis (由一些特定的目录中寻找文件文件名)
在这里插入图片描述locate/updatedb
在这里插入图片描述locate在寻找数据时特别快,因为locate寻找的数据是由已建立的数据库/var/lib/mlocate/里面的数据所搜寻到的,所以不用直接在硬盘中存取数据。但是由于数据库的建立是默认每天执行一次,所以你新建起来的文件,再数据库更新之前是搜不到。此时就需要updatedb这个指令去更新数据库。
updatedb:根据/etc/updatedb.conf的设定去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate内的数据库文件;
locate:依据/var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名。

find
find [PATH] [option] [action]
选项与参数:1.与时间有关的选项:-atime -ctime , -mtime,以mtime为例说明
-mtime n : n为数字,意义为在n天之前的一天之内被更动过内容的为件;
-mtime +n: 列出在n天之前(不含n天本身)被更动过内容的文档名;
-mtime -n:列出在n天之内(含n天本身)被更动过内容的文档名;
-newer file:file作为一个存在的文件,列出比file还要新的文件档名。

问题:如果需要列出过去系统上面24小时内有更动内容(mtime)的文件列出:【find / -mtime 0】 0是重点,0代表目前的时间,表示从现在开始到24小时之前(0天前的24小时之内)。如果是三天前的24小时之内,n则等于3。
用这张图来表示find的时间参数意义如上图,+4则代表,5天前(包括5天)的档名,-4则代表4天内的档名,=4则代表4-5那一天的文件档名。

选项与参数:2.与使用者或组名有关的参数
-uid n : n为数字,这个数字是用户的账号id,即UID,这个UID是记录在/etc/passwd里面与账号名称相对应的数字。
-gid n:n同样为数字,对应的是组名的id,即GID,这个GID记录在/etc/group里面。
-user name:name为使用者账号的名称,例如alba
-group name:name为组名,例如users
-nouser:寻找文件的拥有者不存在与/etc/passwd 的人!
-nogroup:寻找文件的拥有群组不存在于/etc/group的文件!

选项与参数:3.与文件权限及名称有关的参数
-name filename:搜寻文件名为filename的文件;
-size [±]SIZE:搜寻比SIZE还要大(+)或小(-)的文件,这个SIZE的规格有:c代表byte, k代表1024 bytes。
-type TYPE:搜寻文件类型为TYPE的,类型主要有:一般正规文件(f),装置文件(b,c),目录(d),连接档(l),socket(s)及FIFO(p)等属性。
-prem mode:搜寻文件权限刚好等于mode的文件,这个mode为类似chmod的属性值,例如-rwsr-xr-x的属性为4755。
-perm -mode:搜寻文件权限必须要全部囊括mode的权限的文件,比如要搜寻-rwxr–r--,即0744的文件,使用-prem -0744,当一个文件权限为-rwsr-xr-x,即4755,也会被列出来。
-perm /mode:搜寻文件权限包含任一mode的权限的文件。举例,搜寻-rwxr-xr-x,即-prem /755时,但一个文件属性为-rw--------也会被列出来,因为有-rw…属性的存在。

问题:如果想找出/usr/bin, /usr/sbin这两个目录下,只要具有SUID或者SGID就列出来。 我们知道SUID是4分,SGID是2分,总共6分,因此可以下达指令【find /usr/bin /usr/sbin -perm /6000】,而且要注意find可以搜寻此目录这个特色哦!

选项与参数:4.额外可以进行的动作
-exec command: command 为其他指令, -exec后面可以再接其他的指令来处理搜寻到的结果
-print :将结果打印到屏幕上,这个动作是预设动作!

例如:将上面我们问题中找到的文件使用ls -l列出来。下达【find /usr/bin /usr/sbin -perm /6000 -exec ls -l { } \】这个指令, 需要注意的是-exec后面不支持命令别名,所以ls -l不可以用ll来表示。用下图来解说这个例子:
在这里插入图片描述在这个指令中,{ } 代表由find找到的内容, 也就是说find指令的结构会被放到{ }位置中;-exec一直到 **是关键词,代表find额外动作的开始(-exec)到 结束(;)在这中间就是find指令的额外动作,对于本例来说就是ls -l { }啰。因为;(分号)**在bash环境下是有特殊意义的,所以用反斜杠来跳脱。

1.找出/etc底下,文件大小介于50k到60k之间的文件,并完整列出。下达指令【find /etc -size +50k -a -size -60k -exec ls -l { } /;】 其中-a,代表and的意思,为符合两者才成功。
2.找出系统中,大于1MB的文件,下达指令【find / -size +1M】。
3.找出/etc底下,文件容量大于50k且文件所属人不是root的档名,且将权限完整的列出。下达指令【find /etc -size +50k -a! -user root -exec ls -l {} /;】其中!a代表的是反向选择,即不是后面的项目之意。如果想表达或者,即用-o(or)。

6.权限与指令之间的关系

一、让用户能够进入某目录成为可工作目录的基本权限:

  • 可使用的指令,例如cd变换工作目录;
  • 目录所需权限:用户对这个目录至少需要有x权限;
  • 额外需求:如果用户想要在目录内利用ls查阅文件,用户对目录还需要r的权限。

二、用户在某个目录内读取一个文件的基本权限:

  • 可使用的指令,例如cat、more、less、tac等;
  • 目录所需权限:用户对这个目录至少需要x权限;
  • 文件所需权限:使用者对文件至少需要r的权限才行!

三、让使用者可以修改一个文件的基本权限:

  • 可使用的指令:例如nano或者vi编辑器等;
  • 目录所需权限:用户对该文件所在的目录至少要有x权限;
  • 文件所需要权限:使用者对该文件至少要有r,w权限!

四、让一个使用者可以建立一个文件的基本权限:

  • 目录所需权限:用户在该目录下要具有w,x的权限,重点在w。

五、让用户进入某目录并执行该目录下的某个指令之基本权限:

  • 目录所需权限:用户在该目录下至少要有x的权限;
  • 文件所需权限:使用者在该文件至少要有x的权限。
发布了29 篇原创文章 · 获赞 1 · 访问量 1251

猜你喜欢

转载自blog.csdn.net/weixin_42082088/article/details/94971842