Linux读书笔记(二)—— 文件目录管理

Linux目录结构的组织形式和Windows有很大的不同。首先Linux没有“盘符”的概念,也就是说Linux系统不存在所谓的C盘、D盘等。已建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来实现磁盘读写。

既然 Linux 将文件系统挂载到目录下,那么究竟是先有文件系统还是先有目录?和“先有鸡还是先有蛋”一样,这个问题初看起来有点让人犯晕。正确的说法是,Linux 需要首先建立一个根“/”文件系统,并在这个文件系统中建立一系列空目录,,然后将其他硬盘分区(如果有的话)中的文件系统挂载到这些目录中。

理论上说,可以为根目录下的每一个目录都单独划分一个硬盘分区,这样根分区的容量就可以设置得很小(因为几乎所有的东西都存放在其他分区中,根分区中的目录只是起到了“映射”的作用),不过这对于普通用户而言没有太大必要。如果某些目录没有特定的硬盘分区与其挂钩的话,该目录中的所有内容将存放在根分区中。

Linux系统主要目录及其内容如下图所示:
dirdesc.png

References:

  • 《Linux典藏大系:Linux从入门到精通(第二版)》
  • 建立文件和目录

    • 创建目录:mkdir
      该命令可以一次建立一个或几个目录。也可以使用绝对路径来新建目录。默认只创建一层目录,如需递归创建,需要用-p参数。

      $ mkdir -p ~/tempx/job
    • 创建一个空文件:touch
      空文件对建立某些特定的实验环境是有用。另外,当某些应用程序因为缺少文件而无法启动,,而这个文件实际上并不那么重要时,可以建立一个空文件暂时“骗过”这个程序。

    touch命令的另一个用途是更新一个文件的建立日期和时间。touch命令的这个功能在自动备份和整理文件时非常有用,这使得程序可以决定哪些文件已经被备份或整理过了。

      $ touch test.txt
  • 移动、复制和删除

    • 移动和重命名:mv
      mv可以用来移动文件和目录,而且在执行过程中不会有任何信息显示。如果目标目录有同名文件,mv命令会直接替换相应的文件!为此,mv提供了-i参数,有重名时会提示是否覆盖。

      $ mv -i hello test/
      mv: 是否覆盖"test/hello"?

    另一个比较有用的选项是-b。这个选项用一种不同的方式来处理刚才这个问题。在移动文件前,首先在目标目录的同名文件的文件名后加一个“~”,从而避免这个文件被覆盖。例如:

      $ mv -b hello test/
      $ cd test/
      $ ls
      hello
      hello~

    Linux 没有“重命名”这个命令,原因很简单,即没有这个必要。重命名无非就是将一个文件在同一个目录里移动,这是 mv 最擅长的工作。

    • 复制文件和目录:cp
      和mv命令一样,cp默认情况下会覆盖目标目录中的同名文件。可以使用-i选项对这种情况进行提示,也可以使用-b选项对同名文件改名后再复制。

    cp命令在执行复制任务的时候会自动跳过目录。为此,可以使用-r选项。这个选项将子目录连同其中的文件一起复制到另一个子目录下。

    • 删除目录和文件:rmdirrm
      rmdir命令用于删除目录。只需要在后面跟上要删除的目录名作为参数即可,但是 rmdir 命令只能删除空目录。因此,在使用rmdir删除一个目录之前,首先要将这个目录下的文件和子目录删除。rm命令可以一次删除一个或几个文件。和mv等命令一样,rm不会对此作任何提示。通过rm命令删除的文件将永远地从系统中消失了,而不会被放入一个称作“回收站”的临时目录下。一个比较安全的使用 rm 命令的方式是使用-i 选项,这个选项会在删除文件前给出提示,并等待用户确认。

      $ rm -i test/hello
      rm:是否删除 普通空文件“test/hello”?

    可以使用-f选项来避免这样的交互式操作。这样rm就会直接删除文件而不提示。带有-r参数的rm命令会递归地删除目录下所有的文件和子目录。使用rm命令的时候应该格外小心,特别是以root身份执行该命令时。在这方面,已经有过无数惨痛的教训,并且这样的教训每时每刻还在发生。网上盛传的参数组合为:$ rm -rf test。不过在删除文件时还是希望能小心一点,如果因为一时的爽快而删了重要文件是得不偿失的。另:切勿尝试$ rm -rf /*这样危险的命令,否则整个系统将会崩溃。

  • 文件和目录的权限

    Linux为3种人准备了权限——文件所有者(属主)、文件属组用户和其他人。root用户其实是不应该被算在“其他人”里面的特殊用户。可以赋予某类用户对文件和目录享有 3 种权限:读取(r)、写入(w)和执行(x)。对于文件而言,拥有读权限意味着可以打开并查看文件的内容,写入位控制着对文件的修改权限。而是否能够删除和重命名一个文件则是由其父目录的权限设置所控制的。

    对目录而言,所谓的执行权限实际控制了用户能否进入该目录;而读取权限则负责确定能否列出该目录中的内容;写入权限控制着在目录中创建、删除和重命名文件。因此目录的执行权限是最基本的权限。要让一个文件可执行,必须设置其执行权限。可执行文件由两种,一种是可以直接由CPU执行的二进制代码;另一种是Shell脚本程序。

    • 查看目录和文件的属性
      使用带选项-lls命令可以查看一个文件的属性,包括权限。

      linux-o5fc:~ # ls -l file
      -rwxr--r-- 1 root root 14 Dec 11 21:27 file

    这条命令列出了file文件的主要属性信息,这串信息的含义如下:

    第1个字段的第1个字符表示文件类型,在上例中是“-”,表示这是一个普通文件。如果是d则表示是一个目录,l则表示是一个符号链接。接下来的rwxr--r--就是3组权限位。这9个字符应该被这样断句:rwx、r--、r--分别表示属主、属组和其他人所拥有的权限。r表示可读取,w表示可写,x表示可执行。如果某个权限被禁用,那么就用一个短划线“-”代替。在这个例子中,属主拥有读、写和执行权限,属组和其他人拥有读权限。第二个字段表示该文件当前的硬链接(hard link)数量。第3个和第4个字段分别表示文件的属主和属组。最后的4个字段分别表示文件大小(14字节)、最后修改的日期(12月11日)和时间(21:27),以及这个文件的文件名(file)。

    • 改变文件所有权: chownchgrp
      chown命令用于改变文件的所有权。基本语法如下:

      chown [OPTION]... [OWNER][:[GROUP]] FILE...

      这条命令将文件FILE的属主更改为OWNER,属组更改为GROUP。下面这条命令将文件days的属主更改为lewis,而把其属组更改为root组。

      $ sudo chown lewis:root days    ##修改days的属主和属组
      $ sudo chown guest days         ##仅修改days的属主
      $ sudo chown :nogroup days      ##仅修改days的属组
      $ sudo chown -R lewis iso/      ##将iso目录及其下所有文件属主改为lewis
    • 改变文件权限:chmod
      chmod用来改变一个文件的权限。这个命令使用“用户组+/-权限”的表述方式来增加/删除相应的权限。具体来说,用户组包括了文件属主(u)、文件属组(g)、其他人(o)和所有人(a),而权限则包括了读取(r)、写入(w)和执行(x)。

    下面这条命令增加了属主对文件days的执行权限。

      $ chmod u+x days
      `chmod`可以用`a`同时制定所有的3种人。下面这条命令删除所有人对days的执行权限。
      ```sh

    $ chmod a-x days

        还可以通过“用户组=权限”的规则直接设置文件权限。同样应用与文件days,下面这条命令赋予属主和属组的读取/写入权限,而仅赋予其他用户读取权限。

    $ chmod ug=rw,o=r days

    
        最后一条常用规则是“用户组 1=用户组 2”,用于将用户组 1 的权限和用户组 2 的权限设为完全相同。应用于文件 days 中,下面这条命令将其他人的权限设置为和属主的权限一样。

    $ chmod o=u days

    
        只有文件的属组和root用户才能修改文件的权限。
    
    * 文件权限的八进制表示
    `chmod`的助记符尽管意义明确,但有些时候显得太啰嗦了。系统管理员更喜欢用`chmod`的八进制语法来修改文件权限——这样就可以不用麻烦左右手的小指了。
        
    首先介绍下八进制记法的来历。每一组权限rwx在计算机中实际占用了3bit。每一位都只有两种情况。0表示无权限,1表示有权限。3位二进制对应1位八进制。所以用一个八进制数字来表示一组权限。
        
    在实际使用中,只要记住4代表r,2代表w,1代表x,然后简单地做加法就可以了。举例来说,rwx=4+2+1=7,r-x=4+0+1=5。所以777表示所有人有所有的权限,而常见的700表示属主有所有权限。
  • 建立链接
    符号链接(Symbolic Link。也被称作“软连接”)需要使用带-s参数的ln命令来创建。下面是这个命令最简单的形式,这条命令给目标文件TARGET取了一个别名LINK_NAME。符号链接类似于Windows中的快捷方式。

    $ ln -s TARGET LINK_NAME

    有软链接相对的也有硬链接(Hard Link)。硬链接和符号链接本质的不同在于:硬链接是直接引用,而符号链接是通过路径进行引用。使用不带选项的ln命令建立硬链接。

对于一个文件来说,有唯一的索引节点(index node又称inode)与之对应,而一个索引节点号可以有多个文件对应。软链接只是记录了文件的路径,硬链接则是直接访问索引节点。所以当原文件移动时,硬链接可以继续使用,而软链接则会失效。而正是由于inode的限制,硬链接不能跨文件系统,不能指向目录,而软链接则没有这些限制。关于inode的资料可以参考:阮一峰的网络日志-理解inode

在实际工作中更多的是使用符号链接,硬链接已经很少使用。

  • 输入输出重定向和管道
    重定向和管道是Shell的一种高级特性,这种特性允许用户人为地改变程序获取输入和产生输出的位置。

    • 输出重定向

    程序在默认情况下输出结果的地方被称为标准输出(stdout)。通常来说,标准输出总是指向显示器。输出重定向用于把程序的输出转移到另一个地方去。下面的条命令将ls的输出重定向到lsout文件中,将ifconfig的输出重定向到ifout文件中。

    linux-ua71:~ # ls > lsout
    linux-ua71:~ # ifconfig > ifout

    这样,输出就不会在显示器上显示出来,而是全部写入文件中。如果目标文件不存在,那么输出重定向符号“>”会试图建立这个文件。如果目标文件已经存在了,那么“>”会删除文件中原有的内容,然后用新内容替代。如果要保留原来文件中的内容,应该使用输出重定向符号“>>”,这样会在文件末尾追加输出。

    • 输入重定向

    和标准输出类似,程序默认情况下接收输入的地方被称为标准输入(stdin)。通常来说,标准输入总是指向键盘。通过使用输入重定向符号“<”可以让程序从一个文件中获取输入。事实上,大部分命令都能够以参数的形式在命令行上指定输入档的文件名,因此输入重定向并不经常使用。

    • 管道

    管道将“重定向”再向前推进了一步。通过一根竖线“|”,将一条命令的输出连接到另一条命令输入。下面这条命令显示了如何在文件列表中查找文件名中包含某个特定字符串的文件。

    $ ls | grep ay
    days
    hard_days
    mplayer
    mplayer~
    my_days

    ls首先列出当前目录下的所有文件名,管道“|”接收到这些输出,并把它们发送给grep命令作为其输入。最后 grep 在这堆文件列表中查找包含字符串ay的文件名,并在标准输出(也就是显示器)显示。

    可以在一行命令中使用多个管道,从而构造出复杂的 Shell 命令。这些命令可能看起来晦涩难懂,但它们的确很高效,合理使用管道是提高工作效率的有效手段。

标签: none

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……