windows为什么采用树形结构管理文件?

我以前经常在网上查类似于“在Ubuntu下如何让某个用户对某个文件夹拥有可读可写的权限?”,“Mac上如何通过命令行启动某个程序?”,“在Linux中如何彻底卸载某个软件?”这类的问题,当然这类问题都可以较容易的在网上找到解决方案,但是每次解决我都是知其然不知其所以然,所以当下次我碰到类似的问题时,我还是要花一定的时间去查,这让我有一种挫败感;开发相关的知识大多变得特别快,但是有些知识特别经典,其实比起某些库或框架也许更值得系统的了解。这也是本文的写作初衷,一方面是自己对近两个月来看的相关资料做一个总结,另一方面也希望可以帮助Linux初学者更好的理解,运用这个系统。

在我大二的时候,学校里有个学长就《神奇的Ubuntu》为题进行了一次演讲(演讲我并没去听,但是仔细看了那个手绘的宣传板,当时觉得很有意思,不过到现在过了七年多了,也实在是不记得宣传板上具体的内容了,依稀记得把Windows批判了一番。。)。

在那个好奇心最重的年龄,我回去就开始查关于Ubuntu相关的消息,发现它是Linux的众多发行版之一,其它发行版还有centos,redHat,Fedora等等,又不知道从哪里看到,Ubuntu还和MacOS 有一定的亲缘关系(都是类Unix系统),瞬间就懂了尝试使用的心,连夜下载了当时最新的Ubuntu发行版(应该是:显示某域名相关托管服务器/邮件服务器

      • 说明:这个搜索很快,因为它并没有从硬盘中依次查找,而是直接从数据库中查询。whereis 只能搜索二进制文件(-b),man 帮助文件(-m)和源代码文件(-s)。

      • 说明:通过/var/lib/mlocate/mlocate.db 数据库查找,不过这个数据库也不是实时更新的,系统会使用定时任务每天自动执行 updatedb 命令更新一次,所以有时候你刚添加的文件,它可能会找不到,需要手动执行一次 updatedb 命令(在我们的环境中必须先执行一次该命令)。它可以用来查找指定目录下的不同文件类型

      • 可带参数:如-i 参数可以忽略大小写进行查找

      • 说明:我们通常使用 which 来确定是否安装了某个指定的软件,因为它只从 PATH 环境变量指定的路径中去搜索命令

      • 说明:find 应该是这几个命令中最强大的了,它不但可以通过文件类型、文件名进行查找而且可以根据文件的属性(如文件的时间戳,文件的权限等)进行搜索。find很强大也相对而言很复杂,在此先不赘述;

    1. man使用一个叫做less的程序,查看某个命令的帮助文档

     - 使用命令时可在参数中使用通配符
     - 使用`man`查看帮助(man分类如下:)
     - 注意通配符大小写敏感
    

    上文只对常见命令进行了简单的描述,其中一些命令在下文讲到具体应用场景时还会详细的说明。结合刚刚所说的这些命令,我们来理解Linux是一个怎么样的系统。

    有没有想过这样一个问题,我们可以很容易通过外貌等特征认出某台计算机是属于我们自己的,那反过来,计算机是怎么识别目前正在操作的那个人是你呢?就Linux而言,这就涉及到用户管理系统。

    Linux 是一个可以实现多用户登陆的操作系统,多用户可以同时登陆同一台主机,共享主机的一些资源,不同的用户也分别有自己的用户空间,可用于存放各自的文件。虽然不同用户的文件是放在同一个物理磁盘上的甚至同一个逻辑分区或者目录里,但是由于 Linux 的用户管理和 文件权限机制,不同用户不可以轻易地查看、修改彼此的文件。

    查看当前用户有多种方式可以实现,我们试试下面三种命令:

    • $ finger:列出当前用户的详细信息,需使用apt-get提前安装;

    # 会列出当前用户的信息

    一般通过上面的操作会发现我们当前登录的用户并非root,在Linux中,老大root 账户拥有整个系统至高无上的权利,它可以操作系统中所有的对象。在某些发行版中,这个用户并不显式存在,不过如果其它的用户具有使用sudo的权利(后文会叙述如何获取),通过sudo 命令也可以达到用root账号操作的效果。创建用户就是一个需要sudo权限的命令。

    此命令的使用可参看以下实例:

    说完了如何添加用户,再说说如何切换用户。

    • su - <user>:切换用户,同时环境变量也会跟着改变成目标用户的环境变量

    有时候我们也会看到添加用户使用的命令是useradd,而非adduser下面说说二者的区别:

    • sudo adduser lilei:新建一个叫做lilei的用户,添加用户到系统,同时也会默认为新用户创建 home目录:

    用户组,给用户添加组织

    在 Linux 里面每个用户都有一个归属(用户组),用户组简单地理解就是一组用户的集合,它们共享一些资源和权限,同时拥有私有资源。

    查看用户属于那些组(groups):

    关于用户组我们需要注意:

    • 每次新建用户如果不指定用户组的话,默认会自动创建一个与用户名相同的用户组;

    • 默认情况下在 sudo 用户组里的可以使用 sudo 命令获得 root 权限。

    • 使用cat /etc/group | sort命令查看某组包含那些成员:/etc/group文件中分行显示了用户组(Group)、用户组口令、GID 及该用户组所包含的用户(User),格式如下:

    不同的组对不同的文件可能具有不同的操作权限,比如说通过上述命令新建的用户默认是没有使用sudo的权限的,我们可以使用usermod命令把它加入sudo组用以具备相应的权限。

    删除用户也是一个需要管理员权限的命令,使用方法如下:

    • 直接的deluser会删除该用户,但是不会删除用户相关文件;

    使用Linux的过程中,查看修改文件是我们常做的事情之一。但是正如前文所说,文件是有所有权概念的,对同一个文件并非所有用户都对其有一样的权限。

    前面我们提到使用ls命令可以查看文件,ls后还可以带各种参数以实现不同的查看效果,具体如下:

    • ls -l:查看文件及其权限;

    • ls -A:显示隐藏文件(包括以.开头的文件);(a->all)

    • ls -Al:显示隐藏文件及其权限;

    • ls -AsSh:显示所有文件大小,并以普通人类能看懂的方式呈现(小 s 为显示文件大小,大 S 为按文件大小排序);

    示例如下(注:命令行中的Python是我所操作的当前目录的名称):

    # 文件类型和权限 链接数 所有者 用户所在组 大小 最后修改时间 文件名称

    上面的代码中,最让人疑惑的可能就是文件类型和权限这一项了,我们来逐一解释。

    说到文件,不得不提文件类型,Linux中的文件不同于Windows中的文件,在Linux 里面一切皆文件,主要文件类型有以下几种:

    • 普通文件:一般是用一些相关的应用程序创建的(如图像工具、文档工具、归档工具... 或 cp工具等),这类文件的删除方式是用rm 命令,而创建使用touch命令,用符号-表示;

    • 目录:目录在Linux是一个比较特殊的文件,用字符d表示,删除用rm 或rmdir命令;

    • 块设备文件:存在于/dev目录下,如硬盘,光驱等设备,用字符d表示;

    • 设备文件:( /dev 目录下有各种设备文件,大都跟具体的硬件设备相关),如猫的串口设备,用字符c表示;

    • pipe 管道文件:可以实现两个程序(可以从不同机器上telnet)实时交互,用字符p表示;

    • 链接文件:软链接等同于 Windows 上的快捷方式;用字符l表示;

    软硬链接文件的共同点和区别:无论是修改软链接,硬链接生成的文件还是直接修改源文件,相应的文件都会改变,但是如果删除了源文件,硬链接生成的文件依旧存在而软链接生成的文件就不再有效了。

    上面的代码示例中,另一个比较让人疑惑的是drwxr-xr-x这样的语句,这段语句表明了文件的权限。Linux中文件权限主要由以下几种:

    • 写权限,表示你可以编辑和修改某个文件;

    • 执行权限,通常指可以运行的二进制程序文件或者脚本文件(Linux 上不是通过文件后缀名来区分文件的类型);

    • 所有者权限,所属用户组权限,是指你所在的用户组中的所有其它用户对于该文件的权限

    一个目录同时具有读权限和执行权限才可以打开并查看内部文件,而一个目录要有写权限才允许在其中创建其它文件,这是因为目录文件实际保存着该目录里面的文件的列表等信息。

    可用下图加强对文件权限的理解:

    从上图中可以看出,每个文件有三组权限(拥有者,所属用户组,其他用户,这个顺序是一定的),修改权限的命令是chmod,修改文件权限的方法有两种,所示:

    # 用数字的形式表示,数字的来源及计算方法见下图,数字的意义见下图
    # 用字母的形式表示,g、o 还有 u 分别表示 group、others 和 user,+ 和 - 分别表示增加和去掉相应的权限
     


    更改文件所有者chown
     
     
    上面描述文件权限时,都是以自己,所在组,其它三个级别来描述的,那如果你登录的当前账户不是某个文件的所有者,你又不想让这个文件对所有用户开发你想用到的权限,该怎么办呢。还记得前面我们说过老大root用户对所有的文件具有绝对的支配权,我们可以利用这个账号把一个文件过继给另外一个用户(更改文件的所有者)以方便该用户对该文件的操作,使用方法如下:
     
    现在我们有能力获得对某文件的操作能力了,接下来看看Linux下对文件进行简单操作的命令。
     
    • 主要作用是来更改已有文件的时间戳的(比如,最近访问时间,最近修改时间);

    • 在不加任何参数的情况下,只指定一个文件名,则可以创建一个指定文件名的空白普通文件(不会覆盖已有同名文件)

     
     
     
     
     
    • $ rm -r family:删除目录(递归删除其中的子文件)

     
     
    • rename:批量重命名,需要用到正则表达式

     
    # 使用通配符批量创建 5 个文件:
    # 批量将这 5 个后缀为 .txt 的文本文件重命名为以 .c 为后缀的文件:
    # 批量将这 5 个文件,文件名改为大写:
     
     
    cat:打印文件内容到标准输出(终端)(正序);
     
    tac:打印文件内容到标准输出(终端)(逆序);

    标准输入输出:当我们执行一个 shell 命令行时通常会自动打开三个标准文件,即标准输入文件(stdin),默认对应终端的键盘、标准输出文件(stdout)和标准错误输出文件(stderr),后两个文件都对应被重定向到终端的屏幕,以便我们能直接看到输出内容。进程将从标准输入文件中得到输入数据,将正常输出数据输出到标准输出文件,而将错误信息送到标准错误文件中。

     
    cat,tac参数的说明如下:
    -b : 指定添加行号的方式,主要有两种:
     -b a:表示无论是否为空行,同样列出行号("cat -n"就是这种方式)
     -b t:只列出非空行的编号并列出(默认为这种方式)
    -n : 设置行号的样式,主要有三种:
     -n ln:在行号字段最左端显示
     -n rn:在行号字段最右边显示,且不加 0
     -n rz:在行号字段最右边显示,且加 0
    -w : 行号字段占用的位数(默认为 6 位)
     
    more:比较简单,只能向一个方向滚动,查看文件:打开后默认只显示一屏内容,终端底部显示当前阅读的进度。可以使用 Enter 键向下滚动一行,使用 Space 键向下滚动一屏,按下 h 显示帮助,q 退出。

    head:查看文件的头几行(默认10行)
    tail:查看文件的尾几行(默认10行)
     
     
    前面多次提到了类似/dev这样的目录,也提到了目录文件d,不知道你对目录有没有也产生好奇,Linux的目录也是Linux系统中比较重要的一块,不过首先我们得区分Linux的目录和Window的目录的较大的区别:

    不同之一体现在目录与存储介质(磁盘,内存,DVD 等)的关系上,Windows 一直是以存储介质为主的,主要以盘符(C 盘,D 盘...)及分区来实现文件管理,然后之下才是目录,目录就显得不是那么重要,除系统文件之外的用户文件放在任何地方任何目录也是没有多大关系。

     
    然而 UNIX/Linux 恰好相反,UNIX 是以目录为主的,Linux 也继承了这一优良特性。 Linux 以树形目录结构的形式来构建整个系统,可以理解为树形目录是一个用户可操作系统的骨架。虽然本质上无论是目录结构还是操作系统内核都是存储在磁盘上的,但从逻辑上来说 Linux 的磁盘是“挂在”(挂载在)目录上的,每一个目录不仅能使用本地磁盘分区的文件系统,也可以使用网络上的文件系统
    简言之,Windows的目录挂载在磁盘下,而Linux磁盘挂载在目录下,使用Mac的童鞋们,看了这段话是不是突然明白了为什么Mac上安装第三方软件时,会出现盘符。
    初接触Linux时,我们很容易被其看似复杂的文件系统弄得晕头转向,其实在掌握了一定的规律后,Linux的目录结构是比Window简单的(你现在能说清windows系统盘各文件夹的作用不),Linux的大部分目录结构是依据FHS标准(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准)规定好的,

    多数 Linux 版本采用这种文件组织形式,FHS 定义了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

     
    • 第一层是, / 下面的各个目录应该要放什么文件数据,例如 /etc 应该放置设置文件,/bin/sbin 则应该放置可执行文件等等。

    • 第二层则是针对 /usr/var 这两个目录的子目录来定义。例如 /var/log 放置系统登录文件,/usr/share 放置共享数据等等。

     
    这里有个有用的命令:tree(需要先安装),可以查看某个目录的子目录的结构,这个命令还可以限制目录的展示层级,通过man tree你可以获知如何进行具体的操作。
    FHS 是根据以往无数 Linux 用户和开发者的经验总结出来的,并且会维持更新,网上有很多结束FHS的文章,如果感兴趣 可以搜索看看。
    我们回顾一下关于目录的一些常用相关命令:
    • cd:切换目录,后面可以是相对目录,也可以是绝对目录,如$ cd /usr/local/bin

    • pwa:查看当前所在目录

     
     
    使用du命令可以查看目录的容量,配合以下参数可以实现更多效果。
    参数:
    • -d:指定查看目录的深度``

     
    # 只查看1级目录的信息
    du -a #同--all 显示目录中所有文件的大小。
     
     
    在Linux下磁盘是挂载在目录下的,前文大致聊了目录,接下来我们简单说说磁盘管理,前面刚刚说完如何查看目录容量,我们先卡如何查看磁盘的容量。
     
    使用df命令可以查看磁盘的容量
    使用方法可见下例: # 以更友善的方式展示
    上面这条命令是在Mac上执行的,有没有发现微信web开发者工具的安装盘也是一个磁盘。当然这类磁盘都不是真实的物理磁盘,而是虚拟磁盘,下面我们看看如何创建虚拟磁盘:
     

    dd命令用于转换和复制文件,不过它的复制不同于cp。之前提到过关于 Linux 的很重要的一点,一切即文件,在 Linux 上,硬件的设备驱动(如硬盘)和特殊设备文件(如/dev/zero和/dev/random)都像普通文件一样,只要在各自的驱动程序中实现了对应的功能,dd 也可以读取自和/或写入到这些文件。这样,dd也可以用在备份硬件的引导扇区、获取一定数量的随机数据或者空数据等任务中。dd程序也可以在复制时处理数据,例如转换字节序、或在 ASCII 与 EBCDIC 编码间互换。

     
    语句格式:选项=值
    dd默认从标准输入中读取,并写入到标准输出中,但输入输出也可以用选项if(input file,输入文件)和of(output file,输出文件)改变。
    bb复制的基本使用方法如下: # 将输出的英文字符转换为大写再写入文件
    • bs(block size)用于指定块大小(缺省单位为 Byte,也可为其指定如'K','M','G'等单位),

    • count用于指定块数量。

    • 超过bs的多余输入将被截取并保留在标准输入。

     

    使用dd命令创建虚拟镜像文件

     

    使用mkfs命令格式化磁盘

     
    # 输入 sudo mkfs 然后按下Tab键,你可以看到很多个以 mkfs 为前缀的命令,代表不同的文件系统格式
     

    使用 mount 命令挂载磁盘到目录树

     
     
    用户在 Linux/UNIX 的机器上打开一个文件以前,包含该文件的文件系统必须先进行挂载的动作,此时用户要对该文件系统执行 mount 的指令以进行挂载。
    Linux/UNIX 文件系统可以对应一个文件而不一定要是硬件设备,所以可以挂载一个包含文件系统的文件到目录树。

    对Mac安装软件方式的原因理解又进了一步了。

     
    # 查看下主机已经挂载的文件系统,每一行代表一个设备或虚拟设备格式[设备名]on[挂载点]:
    # 类型可省略,很多时候会自动识别
     
     
    磁盘分区大家肯定也很熟悉,Linux下对磁盘分区的方法也很简单,示例如下
    # 查看硬盘分区表信息
     
    到这里,我们初步初步了解了Linux的核心系统,接下来我们对Linux下的一些常用操作进行叙述。

     
    很多人装完系统后第一件事就是装软件,应用部分我们也从软件的安装说起,还是以Ubuntu为例介绍软件的安装和卸载方法:
     
    Linux上软件的安装有四种形式
    • 从磁盘安装deb安装包

     
     
    在线安装命令很简洁,我们先看使用方式,然后叙述每一步的意义: # 如果你在安装一个软件之后,无法立即使用Tab键补全这可命令,使用下述命令刷新
    那么安装的过程究竟发生了什么:
    • 在本地的一个数据库中搜索关于 cowsay 软件的相关信息

    • 根据这些信息在相关的服务器上下载软件安装

    • 安装某个软件时,如果该软件有其它依赖程序,系统会为我们自动安装所以来的程序;

    • 如果本地的数据库不够新,可能就会发生搜索不到的情况,这时候需要我们更新本地的数据库,使用命令sudo apt-get update可执行更新;

    • 软件源镜像服务器可能会有多个,有时候某些特定的软件需要我们添加特定的源;

     
     
    很可能apt-get会是很长一段时间内,你使用的最多的命令,我们先对其进行详细的描述
    作用:用于处理 apt包的公用程序集,我们可以用它来在线安装、卸载和升级软件包
    apt-get命令后可以接不同的工具实现不同的效果,描述如下:
    工具 说明
    • install 其后加上软件包名,用于安装一个软件包

    • update 从软件源镜像服务器上下载/更新用于更新本地软件源的软件包列表

    • upgrade 升级本地可更新的全部软件包,但存在依赖问题时将不会升级,通常会在更新之前执行一次update

    • dist-upgrade 解决依赖关系并升级(存在一定危险性)

    • remove 移除已安装的软件包,包括与被移除软件包有依赖关系的软件包,但不包含软件包的配置文件

    • autoremove 移除之前被其他软件包依赖,但现在不再被使用的软件包

    • purge 与remove相同,但会完全移除软件包,包含其配置文件

    • autoclean 移除已安装的软件的旧版本软件包

     
    apt-get后还可以更一些常见的参数,对这些参数的描述如下:
    • -y 自动回应是否安装软件包的选项,在一些自动化安装脚本中使用这个参数将十分有用

    • -q 静默安装方式,指定多个q或者-q=#,#表示数字,用于设定静默级别,这在你不想要在安装软件包时屏幕输出过多时很有用

    • -f 修复损坏的依赖关系

    • --reinstall 重新安装已经安装但可能存在问题的软件包

     
    # 升级没有依赖问题的软件包 # 升级并解决依赖关系 # 不保留配置文件的移除 # 移除不再需要的被依赖的软件包
     

    apt-cache 命令则是针对本地数据进行相关操作的工具,search 顾名思义在本地的数据库中寻找有关 softname1 softname2 …… 相关软件的信息

    使用dpkg从本地磁盘安装deb软件包

     
    有时候我们也需要下载一些安装包安装,比如你想在Ubuntu下使用webstorm,就可以在其官网上下载响应的deb软件包,使用dpkg命令来安装
    • -R 后面加上目录名,用于安装该目录下的所有deb安装包

    • -r remove,移除某个已安装的软件包

    • -I 显示deb包文件的信息

    • -s 显示已安装软件的信息

    • -S 搜索已安装的软件包
      -L 显示已安装软件包的目录信息

     
    # 安装之前参看deb包的信息 # dpkg并不能为你解决依赖关系 # 修复依赖关系的安装 # 查看已安装软件包的安装目录
     
    二进制包的安装比较简单,我们需要做的只是将从网络上下载的二进制包解压后放到合适的目录,然后将包含可执行的主程序文件的目录添加进PATH环境变量即可,如果你不知道该放到什么位置,请重新复习第四节关于 Linux 目录结构的内容。
    说到了环境变量,接下来我们仔细聊聊shell下的变量,并掌握添加环境变量的方法。
     
    或许你也有过这样的经历,想通过命令行启动某些操作,比如说使用VSCode时希望通过 在命令行中通过code ./project命令打开相应的文件夹。
    各编程语言中都有变量的概念,Shell中的变量也基本如此,变量有如下特点
    • 不同类型(但不用专门指定类型名)

     
    我们看看在bash中添加变量的方法: # 使用 = 号赋值运算符,将变量 tmp 赋值为 God # 读取变量的值:使用 echo 命令和 $ 符号($ 符号用于表示引用一个变量的值)

    Shell中的变量类型

     
    1.自定义变量:当前 Shell 进程私有用户自定义变量,如上面我们创建的 tmp 变量,只在当前 Shell 中有效。
      • 相关命令:set:显示当前 Shell 所有变量,包括其内建环境变量(与 Shell 外观等相关),用户自定义变量及导出的环境变量。

      1. Shell 本身内建的变量

        • 相关命令:env:显示与当前用户相关的环境变量,还可以让命令在指定环境中运行。

      2. 从自定义变量导出的环境变量。

        • 相关命令:export :显示从 Shell 中导出成环境变量的变量,也能通过它将自定义变量导出为环境变量。

        • 通常我们习惯将环境变量名设置为大写;

      在所有的 UNIX 和类 UNIX 系统中,每个进程都有其各自的环境变量设置,且默认情况下,当一个进程被创建时,处理创建过程中明确指定的话,它将继承其父进程的绝大部分环境设置。Shell 程序也作为一个进程运行在操作系统之上,而我们在 Shell 中运行的大部分命令都将以 Shell 的子进程的方式运行。

      环境变量,可以简单地理解成如果某变量在当前进程的子进程有效则为环境变量,否则不是。(在Shell中输入zsh或者bash其实就是创建了一个子shell)。

      我们也可以安装生存周期划分Shell变量:

      • 永久的:需要修改配置文件,变量永久生效;

      • 临时的:使用 export 命令行声明即可,变量在关闭 shell 时失效。

      /etc/profile 里面的是对所有用户永久生效,所以如果想要添加一个永久生效的环境变量,只需要打开 /etc/profile,在最后加上你想添加的环境变量就好啦。

      添加命令到环境变量几乎是每个使用Linux系统的人都会进行的操作:它实现了在 Shell 中输入一个命令,能通过环境变量 PATH 来进行搜索并执行命令,PATH 里面就保存了 Shell 中执行的命令的搜索路径。

      添加自定义路径到"PATH"环境变量的具体方法如下:

      # 这里一定要使用绝对路径
      # 给 PATH 环境变量追加了一个路径,它也只是在当前 Shell 有效,我一旦退出终端,再打开就会发现又失效了。

      通过上述设置,就可以执行mybin目录下的所有命令了。

      想要永久的添加这类环境变量可以用接下来额方法,每个用户的 home 目录中有一个 Shell 每次启动时会默认执行一个配置脚本,以初始化环境,包括添加一些用户自定义环境变量等等。zsh 的配置文件是 .zshrc,相应 Bash 的配置文件为 .bashrc 。它们在 etc 下还都有一个或多个全局的配置文件,不过我们一般只修改用户目录下的配置文件。

      # 可以简单地使用下面命令直接添加内容到 .zshrc 中
       
      上述命令中 >> 表示将标准输出以追加的方式重定向到一个文件中
      当然,你用vim等编辑器直接打开对应文件也是可以实现类似的操作的。

       
      • ${变量名#匹配字串}: 从头向后开始匹配,删除符合匹配字串的最短数据

      • ${变量名##匹配字串}: 从头向后开始匹配,删除符合匹配字串的最长数据

      • ${变量名%匹配字串}: 从尾向前开始匹配,删除符合匹配字串的最短数据

      • ${变量名%%匹配字串}: 从尾向前开始匹配,删除符合匹配字串的最长数据

      • ${变量名/旧的字串/新的字串}:将符合旧字串的第一个字串替换为新的字串

      • ${变量名//旧的字串/新的字串}: 将符合旧字串的全部字串替换为新的字串

       
       
       
      有时候修改了环境变量并未马上生效可用下面这种方法使其马上生效: # source有一个别名叫做.因此可以用下面的方法使得理解生效(第一个点后面有一个空格,且路径需要为绝对路径或者相对路径)
       
      文件的打包和压缩是另一种我们可能会常做的操作,比如说你想在服务器上部署一个wiki系统,下载了dokuwiki的压缩文件夹,这时候就需要解压啦。
       
      • *.tar tar 程序打包,未压缩的文件

       

      使用zip压缩打包程序

       
      # 代码引用自实验楼相关课程
       


      • -r:表示递归打包包含子目录的全部内容

      • -q:表示为安静模式,即不向屏幕输出信息

      • -o:表示输出文件,需在其后紧跟打包输出文件名

      • -[1-9]:设置压缩等级,1 表示最快压缩但体积大,9 表示体积最小但耗时最久。

      • -x:排除我们上一次创建的 zip 文件,否则又会被打包进这一次的压缩文件中

       

      使用unzip命令解压缩zip文件

      # 静默且指定解压目录,目录不存在会自动创建
      # 使用 -O(英文字母,大写 o)参数指定编码类型
       
      # 基本使用,a(没有`-`) 参数添加一个目录 ~ 到一个归档文件中,如果该文件不存在就会自动创建
      # 从指定压缩包文件中删除某个文件:
       
       

      tar 原本只是一个打包工具,只是同时还是实现了对 7z、gzip、xz、bzip2 等工具的支持,这些压缩工具本身只能实现对文件或目录(单独压缩目录中的文件)的压缩,没有实现对文件的打包压缩,所以我们也无需再单独去学习其他几个工具,tar 的解压和压缩都是同一个命令,只需参数不同,使用比较方便。

      # 查看不解包文件 -t 参数
      # 创建不同格式压缩文件(gzip)
       
      • -f:指定创建的文件名,文件名必须写在-f参数后

      • -v:以可视的的方式输出打包的文件

      • -P:保留绝对路径符(默认不保留,防止解压到根目录)

      • -C:解压到指定路径的已存在目录

       
       
       
      Linux下的命令非常多,遇到不熟悉的命令的情况很常见,不过在Linux获取相应的帮助的方法也很简单,主要有以下几种方法:
       

      help 命令是用于显示 shell 内建命令的简要帮助信息。帮助信息中显示有该命令的简要说明以及一些参数的使用以及说明。

       
       

      man 没有内建与外部命令的区分,因为 man 工具是显示系统手册页中的内容,也就是一本电子版的字典,这些内容大多数都是对命令的解释信息,还有一些相关的描述。通过查看系统文档中的 man 也可以得到程序的更多相关信息和 Linux的更多特性。

       
       

      得到的信息比 man 还要多,info 来自自由软件基金会的 GNU 项目,是 GNU 的超文本帮助系统,能够更完整的显示出 GNU 信息。
      man 和 info 就像两个集合,它们有一个交集部分,但与 man 相比,info 工具可显示更完整的 GNU 工具信息。若 man 页包含的某个工具的概要信息在 info 中也有介绍,那么 man 页中会有“请参考 info 页更详细内容”的字样。

       
       

      crontab 命令常见于 Unix 和类 Unix 的操作系统之中,用于设置周期性被执行的指令。该命令从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行。通常,crontab 储存的指令被守护进程激活,crond 为其守护进程,crond 常常在后台运行,每一分钟会检查一次是否有预定的作业需要执行。

      通过 crontab 命令,我们可以在固定的间隔时间执行指定的系统指令或 shell script 脚本。时间间隔的单位可以是分钟、小时、日、月、周的任意组合。比如我们需要每天半夜两点钟自动在线更新数据源,用这个命令进行相关设置就可以实现啦。

       
       
      1. 添加任务:crontab -e,选择合适的编辑器,这里选择1,最后一排我们可以看到计划任务的格式# m h dom mon dow command;(分 时 日 月 周 命令)

      2. 使用crontab -l,查看添加了那些任务;

      3. 每个用户使用 crontab -e 添加计划任务,都会在 /var/spool/cron/crontabs 中添加一个该用户自己的任务文档,这样目的是为了隔离。以 sudo 权限编辑 /etc/crontab 文件就可以添加系统级别的定时任务;

       
      crontab -e 表示为当前用户添加计划任务
       
       

      /etc/cron.daily,目录下的脚本会每天执行一次,在每天的6点25分时运行;

       
      /etc/cron.hourly,目录下的脚本会每个小时执行一次,在每小时的17分钟时运行;
      /etc/cron.mouthly,目录下的脚本会每月执行一次,在每月1号的6点52分时运行;
      /etc/cron.weekly,目录下的脚本会每周执行一次,在每周第七天的6点47分时运行;
       
      简单的顺序执行可以安装以下方法,以;分隔众多命令,shell会自动执行:
      不过我们也可以有选择的执行命令:
      && 和 ||的使用:
      • &&:表示当前一条命令满足条件时执行后面的语句:

       
      • ||:当前的命令不满足条件时执行的后面的语句

       
       

      注:使用$?可以获取上一个命令的返回值(成功为0,不成功为1),which命令在前文中有叙述;

       
       

      管道是一种通信机制,通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)。

       
      管道又分为匿名管道和具名管道。我们在使用一些过滤程序时经常会用到的就是匿名管道,在命令行中由|分隔符表示,|在前面的内容中我们已经多次使用到了。具名管道简单的说就是有名字的管道。
      # 获取etc文件下的详细信息,并以less的方式显示
       

      Shell下的一些其它常用命令

       
       
      前面已经讲述了很多Shell下的常用命令,下面在列出一起其它常用的命令

      cut命令,打印每一行的某一字段

       
       
      # 打印/etc/passwd文件中以:为分隔符的第1个字段和第6个字段分别表示用户名和其家目录:
      # 前五个(包含第五个)
      # 前五个之后的(包含第五个)
      # 2到5之间的(包含第五个)
       
      • -d:用来定义分隔符,默认为tab键,一般与-f配合使用(如果分隔符是空格,必须是两个单引号之间确实有一个空格,是一个哦,不是支持多个)

      • -f:需要选取的字段,根据-d切分的字段集选取,下标从1开始

      • -s:表示不包括那些不含分隔符的行,用于去掉注释或者标题一类的信息

      • -c:以字符为单位进行分割,可以选取指定字符

      • -b:以字节为单位进行分割,可以选取指定字节,这些字节位置将忽略多字节字符边界(比如:汉字),除非同时指定了-n参数

      • -n:取消分割多字节字符,只能和-b参数配合使用,即如果字符的最后一个字节落在由-b参数列表指定的范围之内,则该字符将被选出,否则,该字符将被排除。

       

      grep 命令,在文本中或 stdin 中查找匹配字符串

       
      grep命令是很强大的,也是相当常用的一个命令,它结合正则表达式可以实现很复杂却很高效的匹配和查找
      查找,按照单引号匹配的内容进行搜索
      grep -n 'a' abc.txt:搜索abc.txt 文件中带a的内容
      - n:表示结果中带有行号。
      - i:忽略大小写
      -v: 取反 grep -v -n 'a' abc.txt:不带a
       
      # 搜索/home/zhangwang目录下所有包含"zhangwang"的所有文本文件,并显示出现在文本中的行号:
       

      wc 命令,简单小巧的计数工具

       
       
      wc 命令用于统计并输出一个文件中行、单词和字节的数目
       
      将输入按照一定方式排序,然后再输出,它支持的排序有按字典排序,数字排序,按月份排序,随机排序,反转排序,指定特定字段进行排序等等。 # 按照数字排序就要加上-n参数

      -t参数用于指定字段的分隔符,这里是以":"作为分隔符;-k 字段号用于指定对哪一个字段进行排序

       
       
      uniq命令可以用于过滤或者输出重复行。
      # 让history去掉命令后面的参数然后去掉重复的命令
      # uniq命令只能去连续重复的行,不是全文去重,所以要达到预期效果,我们先排序:
      # 输出重复过的行(重复的只输出一个)及重复次数
       

      shell中的文本处理

       
       
      使用vim等编辑器当然可以进行文本处理,不过这里我们要讨论的是使用命令来进行文本处理
       

      • -d 删除和set1匹配的字符,注意不是全词匹配也不是按字符顺序匹配

      • -s 去除set1指定的在输入文本中连续并重复的字符

       
      # 将输入文本,全部转换为大写或小写输出
       

      选项
      选项 说明
      -x 将Tab转换为空格
      -h 将空格转换为Tab(默认选项)

      cat命令打印文件内容

       
      打印文件内容,加重定向可实现复制功能:
       
      # 查看 /etc/protocols 中的不可见字符,可以看到很多 ^I ,这其实就是 Tab 转义成可见字符的符号
       

      join命令合并文件内容

       
       

      选项
      选项 说明
      -t 指定分隔符,默认为空格
      -i 忽略大小写的差异
      -1 指明第一个文件要用哪个字段来对比,,默认对比第一个字段
      -2 指明第二个文件要用哪个字段来对比,,默认对比第一个字段

      paste命令合并文件

       
      join 命令类似,它是在不对比数据的情况下,简单地将多个文件合并一起,以Tab隔开。
      使用方法
      paste [option] file...
      常见参数
      -d 指定合并的分隔符,默认为Tab
      -s 不合并到一行,每个文件为一行
       
      还记得在Linux下输入输出也是文件么,数据流重定向的作用就是将原本输出到标准输出的数据重定向到一个文件中.
      对输入输出的描述--三个特殊设备
      • stdin(标准输入,对应于你在终端的输入),0 /dev/stdin 标准输入

      • stderr(标准错误输出,对应于终端的输出)2 /dev/stderr 标准错误

       

      文件描述符:文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

       
      重定向模式有两种:
      >:将标准输出导向一个文件(如果该文件已经存在,则清空之前的文件)
      >>:将标准输出追加到一个文件中
       
      # 将标准错误重定向到标准输出,再将标准输出重定向到文件,注意要将重定向到文件写到前面
      # 或者只用bash提供的特殊的重定向符号"&"将标准错误和标准输出同时重定向到文件
       

      使用tee命令同时重定向到多个文件

       
       
      将需要将输出重定向到文件之外也需要将信息打印在终端

      永久重定向exec命令

       
      可以使用exec命令实现“永久”重定向。exec命令的作用是使用指定的命令替换当前的 Shell,及使用一个进程替换当前进程,或者指定新的重定向: # 使用exec替换当前进程的重定向,将标准输出重定向到一个文件 # 后面你执行的命令的输出都将被重定向到文件中,直到你退出当前子shell,或取消exec的重定向(后面将告诉你怎么做)
       
      默认在 Shell 中可以有9个打开的文件描述符,上面我们使用了也是它默认提供的0,1,2号文件描述符,另外我们还可以使用3-8的文件描述符,只是它们默认没有打开而已
      使用下面命令查看当前 Shell 进程中打开的文件描述符:
      使用exec命令可以创建新的文件描述符 # 先进入目录,再查看,否则你可能不能得到正确的结果,然后再回到上一次的目录 # 注意下面的命令>与&之间不应该有空格,如果有空格则会出错

      完全屏蔽命令的输出 黑洞

       

      在类 UNIX 系统中,/dev/null,或称空设备,是一个特殊的设备文件,它通常被用于丢弃不需要的输出流,或作为用于输入流的空文件,这些操作通常由重定向完成。读取它则会立即得到一个EOF。

       
       
      查看日志可以帮我们了解很多问题

      常见的日志一般存放在 /var/log 中

       
       

      系统日志主要是存放系统内置程序或系统内核之类的日志信息如 alternatives.log 、btmp 等等,应用日志主要是我们装的第三方应用所产生的日志如 tomcat7 、apache2 等等。

       
      对不同日志名称及其描述如下:
      日志名称 记录信息
      • boot.log 系统启动时的程序服务的日志信息

      • btmp 错误登陆的信息记录

      • dmesg 启动时,显示屏幕上内核缓冲信息,与硬件有关的信息

      • faillog 用户登录失败详细信息记录

      • kern.log 内核产生的信息记录,在自己修改内核时有很大帮助

      • lastlog 用户的最近信息记录

      • wtmp 登录信息的记录。wtmp可以找出谁正在登陆进入系统,谁使用命令显示这个文件或信息等

       
      查看方法
      less auth.log
      当然查看也可以用之前接触到的其它方法morecat等等。
      注:wtmp,lastlog两个日志不能直接用 less、cat、more 这样的工具来查看。其查看方法是使用last 与 lastlog 工具来提取其中的信息
       
      • 一种是由软件开发商自己来自定义日志格式然后指定输出日志位置,

        • 还有一种方式就是 Linux 提供的日志服务程序,而我们这里系统日志是通过 syslog 来实现,提供日志管理服务。

       

      syslog 是一个系统日志记录程序,在早期的大部分 Linux 发行版都是内置 syslog,让其作为系统的默认日志收集工具,虽然时代的进步与发展,syslog 已经年老体衰跟不上时代的需求,所以他被 rsyslog 所代替了,较新的Ubuntu、Fedora 等等都是默认使用 rsyslog 作为系统的日志收集工具

       
      rsyslog 的配置文件有两个,
      • 一个是 /etc/rsyslog.conf :第一个主要是配置的环境,也就是 rsyslog 的加载什么模块,文件的所属者等;

       
      rsyslog 主要是由 Input、Output、Parser 这样三个模块构成的,并且了解到数据的简单走向,首先通过 Input module 来收集消息,然后将得到的消息传给 Parser module,通过分析模块的层层处理,将真正需要的消息传给 Output module,然后便输出至日志文件中。
       
      又是好长的一篇读书笔记,希望你在看完之后有所收获,希望本文能助你打开Linux的使用大门,附上我觉得比较好shell,Linux学习资料如下:
       
      多练习总能有所收获,祝学习愉快?。
    
      

《Windows文件管理、内存管理》由会员分享,可在线阅读,更多相关《Windows文件管理、内存管理(50页珍藏版)》请在人人文库网上搜索。

1、领先源自专业领先源自专业 知识提升价值知识提升价值文件管理文件管理ADD:南昌国家高新技术开发区高新一路69号博微大楼 邮编:330096TEL :7 /3/4/5 http:/1内容概述硬盘的基本知识文件系统文件夹管理文件管理领先源自专业领先源自专业 知识提升价值知识提升价值文件管理文件管理ADD:南昌国家高新技术开发区高新一路69号博微大楼 邮编:330096TEL :7 /3/4/5 http:/2内容概述硬盘的基本知识文件系统文件夹管理文件管理领先源自专业领先源自

2、专业 知识提升价值知识提升价值硬盘简介Page 3一种能够存储大量数据的设备。读写速度比内存慢,但容量要比内存大得多。硬盘是外部存储器的一种,硬盘所具有的的特性外部存储器都有。外部存储器除了硬盘之外还包括 U盘、软盘等。领先源自专业领先源自专业 知识提升价值知识提升价值Page 4硬盘内存CPU数据是从硬盘中读出,写入到内存中,当CPU需要数据的时候,会从内存中读取,当数据修改完毕后,又从内存中写回到硬盘中。领先源自专业领先源自专业 知识提升价值知识提升价值n 为什么不直接将硬盘中的数据直接读入CPU?Page 5n 原因:硬盘的速度没有内存快领先源自专业领先源自专业 知识提升价值知识提升价值

3、n 硬盘分区是在硬盘上划分几个逻辑区域,这些逻辑区域就代表一个虚拟的硬盘,这样使得一个物理硬盘可以划分成多个硬盘使用。n 分区作用:方便管理文件,不同类型的文件放到不同的分区中,避免因部分数据损坏导致整个磁盘都无法正常工作。硬盘结构-硬盘分区C:D:E:领先源自专业领先源自专业 知识提升价值知识提升价值文件管理文件管理ADD:南昌国家高新技术开发区高新一路69号博微大楼 邮编:330096TEL :7 /3/4/5 http:/7内容概述硬盘的基本知识文件系统文件夹管理文件管理领先源自专业领先源自专业 知识提升价值知识提升价值文件、

4、文件夹1份完整的数据就是文件。份完整的数据就是文件。C:D:E:在内存中是二进制数据在系统中显示的就是一个文件在硬盘中是1段数据领先源自专业领先源自专业 知识提升价值知识提升价值文件、文件夹什么是文件:文件是一组相关信息的集合,任何程序和数据都是一文件的形式存放在计算机的外存储器上,通常存放在磁盘上.在计算机中,文本文档,电子表格,数字图片,歌曲等都属于文件.任何一个文件都具备文件名,文件名是存取文件的依据.文件格式: txt bmp ppt doc等Page 9领先源自专业领先源自专业 知识提升价值知识提升价值文件、文件夹如果所有文件都放在一起,那么要查阅起来就非常不方便,所以就定义了文件夹

5、,用于分类管理文件。领先源自专业领先源自专业 知识提升价值知识提升价值n 什么是文件夹:文件夹是在磁盘上组织程序和文档的一种手段,它既可以包含文件,也可以包含其他文件夹,文件夹中包含的文件夹通常称为”子文件夹”.windows 采用了树形结构已文件夹的形式组织和管理文件.Page 11文件、文件夹领先源自专业领先源自专业 知识提升价值知识提升价值文件、文件夹领先源自专业领先源自专业 知识提升价值知识提升价值文件系统这个文件到底放到哪?难道要把整个硬盘翻个遍才能找到吗??领先源自专业领先源自专业 知识提升价值知识提升价值文件系统如何到图书馆里去借书?首先要了解图书馆的结构,知道去几楼哪个房间去找

6、如何找到一个文件在磁盘中的位置?1. 要规划好数据的存放位置.(文件系统)2. 操作系统要了解数据的存放位置?领先源自专业领先源自专业 知识提升价值知识提升价值文件系统以FAT32文件格式读取某个文件为例:首先走到图书馆的咨询区。询问在图书馆的哪层哪个房间内。走到那个房间查找。以去图书馆找书为例:首先找到FAT区。在FAT区中查找这个文件的起始位置在哪个扇区的哪个簇中。定位到这个簇,读取这个文件。领先源自专业领先源自专业 知识提升价值知识提升价值操作系统对磁盘的管理Page 16领先源自专业领先源自专业 知识提升价值知识提升价值文件管理文件管理ADD:南昌国家高新技术开发区高新一路69号博微大

7、楼 邮编:330096TEL :7 /3/4/5 http:/17内容概述硬盘的基本知识文件系统文件夹管理文件管理领先源自专业领先源自专业 知识提升价值知识提升价值操作系统对文件夹操作的API领先源自专业领先源自专业 知识提升价值知识提升价值操作系统对文件夹操作的API2. 如何使用Windows API?3. 什么是当前目录?1. 什么是API?领先源自专业领先源自专业 知识提升价值知识提升价值什么是APIPage 20还记得什么是第三方库么?API就是用于调用Window操作系统提供的功能的第三方库领先源自专业领先源自专业 知识

8、提升价值知识提升价值如何引入Window APIPage 21引入windows API头文件我们只需要在使用API前包含windows.h就可以了领先源自专业领先源自专业 知识提升价值知识提升价值什么是当前目录Page 22相对路径就是指有这个文件所在的路径引起的跟其他文件或文件夹的路径关系,使用相对路径可以为我们带来很多的便利.如下图所示,windows目录下内容就是相对root的目录,只包含一级关系领先源自专业领先源自专业 知识提升价值知识提升价值什么是当前目录Page 23请问上面那段代码会将TestDir文件夹生成到哪?放在应用程序所在的目录当前目录就是用于从相对路径合成绝对路径时用

9、到的路径当前目录就是用于从相对路径合成绝对路径时用到的路径绝对路径=当前目录当前目录+相对路径默认的当前目录是应用程序所在的目录领先源自专业领先源自专业 知识提升价值知识提升价值什么是短路径n Windows对长路径名文件作了限制,最多允许260个字符长度的路径n 事实上所有的Windows API都要遵循这个限制,操作系统不允许超过260个字符文件的全路径.实际应用中这种260个字符的全路径在实际开发中很不方便,又是我们只需要文件的名字,而不需要文件的全路径.只给出文件的名字,而不需要文件的全路径,我们就叫做文件的短路径.Page 24领先源自专业领先源自专业 知识提升价值知识提升价值文件管

10、理文件管理ADD:南昌国家高新技术开发区高新一路69号博微大楼 邮编:330096TEL :7 /3/4/5 http:/25内容概述硬盘的基本知识文件系统文件夹管理文件管理05路径管理领先源自专业领先源自专业 知识提升价值知识提升价值Page 26Page 26领先源自专业领先源自专业 知识提升价值知识提升价值2. 什么是文件指针?3. 什么是缓存区?1. 什么是句柄?领先源自专业领先源自专业 知识提升价值知识提升价值句柄就是用于操作文件的”钥匙”。当使用CreateFile打开文件时,操作系统会提供给以一把“钥匙”用于操作文件。

11、当不使用文件了,需要调用CloseHandle把”钥匙”归还给操作系统。领先源自专业领先源自专业 知识提升价值知识提升价值C:abc.txt文件指针文件指针1. 当打开文件后,会有一个标记位指向文件内容的某个位置。文件的读写都是从这个位置开始的。默认的打开一个文件时,该指针指向文件起始位置。C:abc.txt文件指针文件指针123领先源自专业领先源自专业 知识提升价值知识提升价值存放数据的内存就是缓存区。缓存区溢出:缓存区溢出:当读取文件时,准备的内存不够,就会造成溢出。1.当写文件的时候,写入了超过缓存区长度的数据。领先源自专业领先源自专业 知识提升价值知识提升价值lpFileName: 文

我要回帖

更多关于 windows资源管理器采用的是 的文章

 

随机推荐