• 鸟哥的linux私房菜学习-(八)Linux 文件与目录管理


    1. 目录与路径

    1.1相对路径与绝对路径:

    • 绝对路径:路径的写法『一定由根目录 / 写起』,例如: /usr/share/doc 这个目录。
    • 相对路径:路径的写法『不是由 / 写起』,例如由 /usr/share/doc 要到 /usr/share/man 底下时,可以写成: 『cd ../man』这就是相对路径的写法啦!相对路径意指『相对於目前工作目录的路径!』

    1.2目录的相关操作:

    需要特别注意的是:在所有目录底下都会存在的两个目录,分别是『.』与『..』 分别代表此层与上一级目录的意思。那么来思考一下底下这个例题:

    例题:
    请问在Linux底下,根目录下有没有上一级目录(..)存在?
    答:
    若使用『 ls -al / 』去查询,可以看到根目录下确实存在 . 与 .. 两个目录,再仔细的查阅, 可发现这两个目录的属性与权限完全一致,这代表根目录的上一层(..)与根目录自己(.)是同一个目录。

    1.2.1 cd 变换目录

    cd是Change Directory的缩写,这是用来变换工作目录的命令。注意,目录名称与cd命令之间存在一个空格。 

    1.2.2 pwd 显示当前所在目录

    pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令

    1.2.3 mkdir 创建新目录

    1.2.4  rmdir 删除空目录

    1.3 关于运行路径的变量: $PATH

    为什么我可以在任何地方运行/bin/ls这个命令呢? 』 为什么我在任何目录下输入 ls 就一定可以显示出一些信息而不会说找不到该 /bin/ls 命令呢? 这是因为环境变量 PATH 的帮助所致呀!

    当我们在运行一个命令的时候,举例来说『ls』好了,系统会依照PATH的配置去每个PATH定义的目录下搜寻档名为ls的可运行档, 如果在PATH定义的目录中含有多个档名为ls的可运行档,那么先搜寻到的同名命令先被运行!

    现在,请下达『echo $PATH』来看看到底有哪些目录被定义出来了? echo有『显示、印出』的意思,而 PATH 前面加的 $ 表示后面接的是变量,所以会显示出目前的 PATH !

     2. 文件与目录管理

    .文件与目录的管理上,不外乎『显示属性』、 『拷贝』、『删除文件』及『移动文件或目录』等等,由於文件与目录的管理在 Linux 当中是很重要的, 尤其是每个人自己家目录的数据也都需要注意管理!

    2.1 文件与目录的检视: ls

     

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

       2.2.1 cp  (复制文件或目录)

    复制(cp)这个命令是非常重要的,不同身份者运行这个命令会有不同的结果产生,尤其是那个-a, -p的选项, 对於不同身份来说,差异则非常的大!

     2.2.2  rm 移除文件或目录

    2.2.3  mv  移动文件与目录,或更名

     3.查看文件内容

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

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

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

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

    • 空白键 (space):代表向下翻一页;
      Enter         :代表向下翻『一行』;
      /字串         :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
      :f            :立刻显示出档名以及目前显示的行数;
      q             :代表立刻离开 more ,不再显示该文件内容。
      b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
    • less 与 more 类似,但是比 more 更好的是,他可以往前翻页!

    • 空白键    :向下翻动一页;
      [pagedown]:向下翻动一页;
      [pageup]  :向上翻动一页;
      /字串     :向下搜寻『字串』的功能;
      ?字串     :向上搜寻『字串』的功能;
      n         :重复前一个搜寻 (与 / 或 ? 有关!)
      N         :反向的重复前一个搜寻 (与 / 或 ? 有关!)
      q         :离开 less 这个程序;
    • head 只看头几行

    • /etc/man.config共有141行,则上述的命令『head -n -100 /etc/man.config』 就会列出前面41行,后面100行不会列印出来了
    • tail 只看尾巴几行

    • od   以二进位的方式读取文件内容!

     

    修改文件时间或建置新档: touch

      • modification time (mtime)
        当该文件的『内容数据』变更时,就会升级这个时间!内容数据指的是文件的内容,而不是文件的属性或权限喔!

      • status time (ctime)
        当该文件的『状态 (status)』改变时,就会升级这个时间,举例来说,像是权限与属性被更改了,都会升级这个时间啊。 

      • access time (atime)
        当『该文件的内容被取用』时,就会升级这个读取时间 (access)。举例来说,我们使用 cat 去读取 /etc/man.config , 就会升级该文件的 atime 了。

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

      4.1 文件默认权限:umask

      • 若使用者创建为『文件』则默认『没有可运行( x )权限』,亦即只有 rw 这两个项目,也就是最大为 666 分,默认权限如下:
        -rw-rw-rw-

      • 若使用者创建为『目录』,则由於 x 与是否可以进入此目录有关,因此默认为所有权限均开放,亦即为 777 分,默认权限如下:
        drwxrwxrwx

    创建文件时:(-rw-rw-rw-) - (-----w--w-) ==> -rw-r--r--
    创建目录时:(drwxrwxrwx) - (d----w--w-) ==> drwxr-xr-x
         【创建时默认权限】 【umaks默认减去权限】

     当我们需要新建文件给同群组的使用者共同编辑时,那么 umask 的群组就不能拿掉 2 这个 w 的权限! 所以罗, umask 就得要是 002 之类的才可以!

    这样新建的文件才能够是 -rw-rw-r-- 的权限模样喔! 那么如何配置 umask 呢?简单的很,直接在 umask 后面输入 002 就好了!

      4.2 文件的隐藏属性

      要先强调的是,底下的chattr命令只能在Ext2/Ext3的文件系统上面生效, 其他的文件系统可能就无法支持这个命令了。

    • chattr (配置文件隐藏属性)

    这个命令是很重要的,尤其是在系统的数据安全上面!由於这些属性是隐藏的性质,所以需要以 lsattr 才能看到该属性呦!其中,个人认为最重要的当属 +i 与 +a 这个属性了。+i 可以让一个文件无法被更动,对於需要强烈的系统安全的人来说, 真是相当的重要的!里头还有相当多的属性是需要 root 才能配置的呢!

    • lsattr (显示文件隐藏属性)

    使用 chattr 配置后,可以利用 lsattr 来查阅隐藏的属性。不过, 这两个命令在使用上必须要特别小心,否则会造成很大的困扰。例如:某天你心情好,突然将 /etc/shadow 这个重要的密码记录文件给他配置成为具有 i 的属性,那么过了若干天之后, 你突然要新增使用者,却一直无法新增!别怀疑,赶快去将 i 的属性拿掉吧!

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

     现在你应该已经知道数字型态更改权限的方式为『三个数字』的组合, 那么如果在这三个数字之前再加上一个数字的话,最前面的那个数字就代表这几个权限了!

     

    • 4 为 SUID
    • 2 为 SGID
    • 1 为 SBIT

     

    假设要将一个文件权限改为『-rwsr-xr-x』时,由於 s 在使用者权限中,所以是 SUID ,因此, 在原先的 755 之前还要加上 4 ,也就是:『 chmod 4755 filename 』来配置!此外,还有大 S 与大 T 的产生喔!参考底下的范例啦!

     

    Tips:
    注意:底下的范例只是练习而已,所以鸟哥使用同一个文件来配置,你必须了解 SUID 不是用在目录上,而 SBIT 不是用在文件上的喔!

     

    观察文件类型:file

    5.命令和文件的搜索

      5.1命令名的搜索

       which寻找运行档

    这个命令是根据『PATH』这个环境变量所规范的路径,去搜寻『运行档』的档名~ 所以,重点是找出『运行档』而已!且 which 后面接的是『完整档名』喔!若加上 -a 选项,则可以列出所有的可以找到的同名运行档,而非仅显示第一个而已!

     文件名的搜索:

    • whereis (寻找特定文件)

    那么 whereis 到底是使用什么咚咚呢?为何搜寻的速度会比 find 快这么多? 其实那也没有什么!这是因为 Linux 系统会将系统内的所有文件都记录在一个数据库文件里面, 而当使用 whereis 或者是底下要说的 locate 时,都会以此数据库文件的内容为准, 因此,有的时后你还会发现使用这两个运行档时,会找到已经被杀掉的文件! 而且也找不到最新的刚刚创建的文件呢!这就是因为这两个命令是由数据库当中的结果去搜寻文件的所在啊! 更多与这个数据库有关的说明,请参考下列的 locate 命令。

    • locate

    这个东西还是有使用上的限制呦!为什么呢?你会发现使用 locate 来寻找数据的时候特别的快, 这是因为 locate 寻找的数据是由『已创建的数据库 /var/lib/mlocate/』 里面的数据所搜寻到的,所以不用直接在去硬盘当中存取数据,呵呵!当然是很快速罗!

    那么有什么限制呢?就是因为他是经由数据库来搜寻的,而数据库的创建默认是在每天运行一次 (每个 distribution 都不同,CentOS 5.x 是每天升级数据库一次!),所以当你新创建起来的文件, 却还在数据库升级之前搜寻该文件,那么 locate 会告诉你『找不到!』呵呵!因为必须要升级数据库呀!

    那能否手动升级数据库哪?当然可以啊!升级 locate 数据库的方法非常简单,直接输入『 updatedb 』就可以了! updatedb 命令会去读取 /etc/updatedb.conf 这个配置档的配置,然后再去硬盘里面进行搜寻档名的动作, 最后就升级整个数据库文件罗!因为 updatedb 会去搜寻硬盘,所以当你运行 updatedb 时,可能会等待数分钟的时间喔!

    • updatedb:根据 /etc/updatedb.conf 的配置去搜寻系统硬盘内的档名,并升级 /var/lib/mlocate 内的数据库文件;
    • locate:依据 /var/lib/mlocate 内的数据库记载,找出使用者输入的关键字档名。
    • find

    时间参数真是挺有意思的!我们现在知道 atime, ctime 与 mtime 的意义,如果你想要找出一天内被更动过的文件名称, 可以使用上述范例一的作法。但如果我想要找出『4天内被更动过的文件档名』呢?那可以使用『 find /var -mtime -4』。那如果是『4天前的那一天』就用『 find /var -mtime 4 』。有没有加上『+, -』差别很大喔!我们可以用简单的图示来说明一下:

    图中最右边为目前的时间,越往左边则代表越早之前的时间轴啦。由图5.2.1我们可以清楚的知道:

    • +4代表大於等於5天前的档名:ex> find /var -mtime +4
    • -4代表小於等於4天内的文件档名:ex> find /var -mtime -4
    • 4则是代表4-5那一天的文件档名:ex> find /var -mtime 4

     

    该范例中特殊的地方有 {} 以及 ; 还有 -exec 这个关键字,这些东西的意义为:

    • {} 代表的是『由 find 找到的内容』,如上图所示,find 的结果会被放置到 {} 位置中;
    • -exec 一直到 ; 是关键字,代表 find 额外动作的开始 (-exec) 到结束 (;) ,在这中间的就是 find 命令内的额外动作。 在本例中就是『 ls -l {} 』罗!
    • 因为『 ; 』在 bash 环境下是有特殊意义的,因此利用反斜线来跳脱。

     另外,find 还可以利用万用字节来找寻档名呢!举例来说,你想要找出 /etc 底下档名包含 httpd 的文件, 那么你就可以这样做:

     

    不但可以指定搜寻的目录(连同次目录),并且可以利用额外的选项与参数来找到最正确的档名!真是好好用! 不过由於 find 在寻找数据的时后相当的操硬盘!所以没事情不要使用 find 啦!有更棒的命令可以取代呦!那就是上面提到的whereis 与 locate 罗!

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

     要进入目录最少要有x可执行权限,

    要读取目录内的文件最少要有x可执行权限,

    要修改目录内的文件最少要有x可执行权限。

    要读取文件最少要有r可执行权限;

    要修改文件最少要有r,w权限。

    一、让使用者能进入某目录成为『可工作目录』的基本权限为何:

    • 可使用的命令:例如 cd 等变换工作目录的命令;
    • 目录所需权限:使用者对这个目录至少需要具有 x 的权限
    • 额外需求:如果使用者想要在这个目录内利用 ls 查阅档名,则使用者对此目录还需要 r 的权限。

    二、使用者在某个目录内读取一个文件的基本权限为何?

    • 可使用的命令:例如本章谈到的 cat, more, less等等
    • 目录所需权限:使用者对这个目录至少需要具有 x 权限;
    • 文件所需权限:使用者对文件至少需要具有 r 的权限才行!

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

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

    四、让一个使用者可以创建一个文件的基本权限为何?

    • 目录所需权限:使用者在该目录要具有 w,x 的权限,重点在 w 啦!

    五、让使用者进入某目录并运行该目录下的某个命令之基本权限为何?

    • 目录所需权限:使用者在该目录至少要有 x 的权限;
    • 文件所需权限:使用者在该文件至少需要有 x 的权限
    例题:
    让一个使用者 vbird 能够进行『cp /dir1/file1 /dir2』的命令时,请说明 dir1, file1, dir2 的最小所需权限为何?
    答:
    运行 cp 时, vbird 要『能够读取来源档,并且写入目标档!』所以应参考上述第二点与第四点的说明! 因此各文件/目录的最小权限应该是:
    • dir1 :至少需要有 x 权限;
    • file1:至少需要有 r 权限;
    • dir2 :至少需要有 w, x 权限。

     

    例题:
    有一个文件全名为 /home/student/www/index.html ,各相关文件/目录的权限如下:
    drwxr-xr-x 23 root    root    4096 Sep 22 12:09 /
    drwxr-xr-x  6 root    root    4096 Sep 29 02:21 /home
    drwx------  6 student student 4096 Sep 29 02:23 /home/student
    drwxr-xr-x  6 student student 4096 Sep 29 02:24 /home/student/www
    -rwxr--r--  6 student student  369 Sep 29 02:27 /home/student/www/index.html
    请问 vbird 这个帐号(不属於student群组)能否读取 index.html 这个文件呢?
    答:
    虽然 www 与 index.html 是可以让 vbird 读取的权限,但是因为目录结构是由根目录一层一层读取的, 因此 vbird 可进入 /home 但是却不可进入 /home/student/ ,既然连进入 /home/student 都不许了, 当然就读不到 index.html 了!所以答案是『vbird不会读取到 index.html 的内容』喔!

    那要如何修改权限呢?其实只要将 /home/student 的权限修改为最小 711 ,或者直接给予 755 就可以罗! 这可是很重要的概念喔!
  • 相关阅读:
    C
    如何让asp.net mvc 直接运行mobile页面
    Nuget找不到服务器
    C#调用R语言输出图片
    sql列转行
    C#读取注册表
    关于这个博客,关于我
    NOIP 2016 简要题解
    CSP2019 题解
    CF 练死劲
  • 原文地址:https://www.cnblogs.com/wenlin66/p/8289126.html
Copyright © 2020-2023  润新知