Linux目录操作

作者: 学习编程王同学 | 来源:发表于2018-05-08 18:08 被阅读59次

    本篇文章中使用的目录结构:

    /home/tom
    ├── bin
    ├── gamelist.txt
    └── homework
        ├── chinese
        ├── math
        │   └── ca.txt
        └── science
    
    

    路径名、文件名、工作目录

    一个路径名(路径),从/字符开始,该字符表示根目录;然后是到达该文件途径的所有的目录名,目录名之间使用/分隔,例如:

    /home/tom/homework/math/ca.txt
    

    路径名描述了从根目录到某文件所经过的目录树的路径,其中ca.txt叫做文件名

    目前所在的目录称为工作目录(当前目录)

    每当使用工作目录中的目录或者文件时,不需要指定整个路径,只需要键入文件名即可:

    假设您目前处于/home/tom目录中,也就是说您的工作目录是/home/tom,目录下有一个文本文件/home/tom/gamelist.txt,和一个目录/home/tom/homework,那么下面的两条路径是等效的:

    /home/tom/gamelist.txt
    gamelist.txt
    

    下面两条路径也是等效的:

    /home/tom/homework
    homework
    

    对于路径,当使用/开头的名称时,Linux假定这个名称是一个完整的路径名,从根目录开始;当只是用文件名时,Linux假定使用工作目录中的文件。

    绝对路径、相对路径、四个路径缩写

    如果目录序列从根目录开始,则称之为绝对路径名(absolute pathname)

    如果目录序列从工作目录开始,则称之为相对路径名(relative pathname)

    假设您目前在/home/tom中,那么下面两条命令是等效的:

    /home/tom/gamelist.txt  # 绝对路径名
    gamelist.txt            # 相对路径名
    

    Linux中有四个路径缩写:...~-

    • ..:父目录。
    • .:当前目录。
    • ~:家目录。
    • -:上一个工作目录。

    假设您在系统中用tom用户名登录,并且家目录是/home/tom,您当前的工作目录是/home/tom/homework(其中cd是切换工作目录到指定目录的命令):

    $ cd .      # 仍然在当前目录 /home/tom/homework
    $ cd ..     # 到父目录中,即 /home/tom
    $ cd ../..  # 到父目录的父目录中,即 /
    $ cd ~      # 到家目录中,即 /home/tom
    $ cd -      # 到上一个工作目录,即 /
    

    ...都是缩写,当路径使用..或者.开头时,实际上指的是一个完整的路径名。

    ...是实际的目录,由文件系统提供;~是shell提供的便利写法;-是命令cd提供的便利写法。

    Linux认为根目录的父目录就是根目录本身。

    目录中移动 cd pwd、移动目录 mv、重命名目录 mv

    显示工作目录的名称,可以使用pwd命令:

    $ pwd
    

    切换工作目录,使用cd命令。

    只需要在cd命令后面输入指定的目录名即可。

    $ cd /home/tom  # 切换工作目录到家目录
    $ cd ~          # 切换工作目录到家目录
    $ cd ..         # 切换工作目录到父目录
    $ cd tom        # 切换到当前工作目录下的tom目录
    $ cd ../tom     # 切换到父目录下的tom目录
    

    cd是bash的内建命令,使用$ help cd查看该命令的更多内容。

    如果想要对目录进行移动,比如要将/home/homework/math目录移动到家目录下,即移动之前:

    /home/tom
    ├── bin
    ├── gamelist.txt
    └── homework
        ├── chinese
        ├── math        # 将要移动的目录
        │   └── ca.txt
        └── science
    

    移动之后:

    /home/tom
    ├── bin
    ├── gamelist.txt
    ├── homework
    │   ├── chinese
    │   └── science
    └── math            # 移动之后的目录
        └── ca.txt
    
    

    那么使用下面这条命令:

    $ mv /home/tom/homework/math/ /home/tom
    

    mv的语法为:

    mv SOURCE DEST
    

    SOURCE是希望移动或重命名的目录,DEST是目标或者新名称。

    如果您目前的工作目录是/home/wm,那么完全可以使用相对路径:

    $ pwd
    /home/tom
    $ mv homework/math/ ./
    

    mv命令不仅可以用来目录,还可以对目录进行重命名。

    如果要将工作目录中的homework重命名为hw,可以使用下面的命令:

    $ mv homework hw
    

    创建目录 mkdir、删除目录 rmdir rm

    使用mkdir [OPTION]... DIRECTORY...创建目录,常用的命令选项有-p

    $ mkdir extra               # 创建extra目录
    $ mkdir history literature  # 创建history、literature两个目录
    $ mkdir ~/bin               # 在家目录下创建bin目录
    

    使用mkdir有两点需要注意:

    1. 在一个目录中,不能有两个相同名字的子目录。
    2. 默认情况下,如果父目录不存在,则不能创建子目录。

    可以使用-p选项忽略第二条限制:

    $ mkdir abc/def
    mkdir: cannot create directory ‘abc/def’: No such file or directory
    $ mkdir -p abc/def 
    

    一些特殊字符不能出现在目录名中,比如/,大多数时候,目录名使用小写字母。

    删除目录使用rmdir命令,常用的命令选项是-p

    rmdir命令有几点需要注意:

    • 不能删除空的目录。这是一项安全检查,防止失误删除文件。
    • 默认只会删除目录序列中的最末的目录。可以使用-p来删除一串空目录。
    • 不能删除工作目录和根目录之间的任何目录。
    $ rmdir foo # 删除foo目录
    
    $ rmdir -p foo/bar  # 删除foo和foo下的bar目录
                        # bar必须是空目录
                        # foo下必须只用bar一个文件(目录也是文件)
    

    rm命令可以用来删除目录,对目录是否为空没有限制,使用-r选项删除目录,-i选项对用户进行提示。

    rm -r foo/bar # 删除foo下的bar目录,而不检查是否为空
    

    ls 基本操作

    ls用来显示目录内容。

    将目录名作为参数,可以打印出目录中的内容。

    $ ls homework/
    chinese  math  science
    

    homework目录中有三个文件(目录),分别是chinesemathscience

    也可以同时显示多个目录的内容,比如下面的例子显示了homeworkbin目录下的内容,其中bin目录下没有文件,homework中有三个文件:

    $ ls bin homework/
    bin:
    
    homework/:
    chinese  math  science
    

    使用-R参数可以显示目录的全部“子孙”:

    $ ls -R homework/
    homework/:
    chinese  math  science
    
    homework/chinese:
    
    homework/math:
    ca.txt
    
    homework/science:
    

    -F选项可以查看目录中文件的类型:

    $ ls -F ./
    bin/  gamelist.txt  homework/
    

    当前目录下有三个文件,其中binhomework是目录,gamelist.txt是普通文件。下表显示了ls -F命令显示的标志:

    标志 含义
    普通文件:非可执行文件
    * 普通文件:可执行文件
    / 目录
    @ 符号链接
    ` ` 命名管道/FIFO

    默认情况下,ls命令不会显示以.开头的文件,这类文件称为隐藏文件。为了显示隐藏文件,可以使用-a选项显示出所有文件:

    $ ls -a
    .   .bash_history  .bashrc  .cache        .hello    .lesshst
    ..  .bash_logout   bin      gamelist.txt  homework  .profile
    

    -l选项可以显示目录中文件的更多信息,-h选项使用“人性化”的单位显示文件大小。

    $ ls -l
    total 8
    drwxrwxr-x 2 tom tom 4096 May 29  2017 bin
    -rw-rw-r-- 1 tom tom    0 May  6 20:23 gamelist.txt
    drwxrwxr-x 5 tom tom 4096 May 29  2017 homework
    

    第一行total 8表示此目录一共占用8字节空间。

    之后的三行为目录中的文件,每个文件一行,以其中一行为例,说明每列的意义:

    drwxrwxr-x 2 tom tom 4096 May 29  2017 bin
    

    其中(从左至右):

    • d:指示符,表示这是一个目录。其余的指示符有:-普通文件、l符号连接、b特殊文件(块设备)、c特殊文件(字符设备)、p命名管道/FIFO。
    • rwxrwxr-x:一共三组,表示所有者、组用户和其他用户的权限。r代表可读、w代表可写、x代表可执行。
    • 2:如果是目录,则表示目录中第一级子目录的个数;如果是普通文件,则表示其连接数。
    • tom:所有者。
    • tom:所属组。
    • 4096:占用空间,以字节为单位。
    • May 29 2017:最后修改时间。
    • bin:文件名。

    使用-h选项可以用适当的单位显示文件的大小:

    $ ls -lh
    total 8.0K
    drwxrwxr-x 2 tom tom 4.0K May 29  2017 bin
    -rw-rw-r-- 1 tom tom    0 May  6 20:23 gamelist.txt
    drwxrwxr-x 5 tom tom 4.0K May 29  2017 homework
    

    如果想列出某个目录自身(而不是其包含的文件)的信息,需使用-d选项:

    $ ls -dl homework/
    drwxrwxr-x 5 tom tom 4096 May 29  2017 homework/
    

    查看文件大小 du

    du(disk usage)可以用来显示文件的大小。

    下面主要展示它的四个命令选项:

    • -a:显示全部文件。
    • -c:在最后一行显示左右指定文件总大小。
    • -h:使用合适的单位显示文件大小。
    • -s:只显示指定文件总大小。

    使用du可以方便的查看文件的大小:

    $ du
    4       ./homework/math
    4       ./homework/science
    4       ./homework/chinese
    16      ./homework
    4       ./.cache
    4       ./bin
    48      .
    

    du默认使用KB为单位,上面的例子中,第一列是文件大小,第二列是文件名。

    使用-a选项可以查看全部文件:

    $ du -a
    0       ./gamelist.txt
    0       ./homework/math/ca.txt
    4       ./homework/math
    4       ./homework/science
    4       ./homework/chinese
    16      ./homework
    4       ./.lesshst
    0       ./.cache/motd.legal-displayed
    4       ./.cache
    0       ./.hello
    4       ./.bashrc
    4       ./.bash_history
    4       ./.profile
    4       ./bin
    4       ./.bash_logout
    48      .
    

    也可以指定一个或者多个文件作为命令参数:

    $ du -h homework/ bin/
    4.0K    homework/math
    4.0K    homework/science
    4.0K    homework/chinese
    16K     homework/
    4.0K    bin/
    

    例子中使用-h选项让du以合适的单位显示文件大小。

    使用-s显示指定文件的总大小:

    $ du -sh homework/ bin/
    16K     homework/
    4.0K    bin/
    

    使用-c选项显示所有文件的总大小:

    $ du -csh homework/ bin/
    16K     homework/
    4.0K    bin/
    20K     total
    

    通配符

    通配符是表示特殊意义的字符。

    常用的通配符如下:

    符号 含义`
    * 匹配任何0个或多个字符
    ? 匹配任何单个字符
    [list] 匹配list中的任何字符
    [^list] 匹配不在list中的任何字符
    {string1,string2...} 依次匹配其中指定的字符串

    下面是几个例子:

    $ ls /bin/b*
    /bin/bash     /bin/bzcat   /bin/bzegrep  /bin/bzgrep        /bin/bzless
    /bin/bunzip2  /bin/bzcmp   /bin/bzexe    /bin/bzip2         /bin/bzmore
    /bin/busybox  /bin/bzdiff  /bin/bzfgrep  /bin/bzip2recover
    

    上面的命令显示出了/bin目录下所有以b开头的文件,其中*匹配了任意0个或多个字符。

    $ ls /bin/bz*grep
    /bin/bzegrep  /bin/bzfgrep  /bin/bzgrep
    

    这个例子匹配到了以bz开头,以grep结尾的所有文件。

    $ ls /bin/bz?grep
    /bin/bzegrep  /bin/bzfgrep
    

    这个例子匹配到了两个文件,其中?代表着单个字符。

    $ ls /bin/bz[fgh]grep
    /bin/bzfgrep
    

    [fgh]代表着匹配f、g、h中的任意字符。

    {string1,string2……}表示依次匹配其中的字符串。

    $ ls /bin/bz{grep,fgrep,ggrep}
    ls: cannot access '/bin/bzggrep': No such file or directory
    /bin/bzfgrep  /bin/bzgrep
    

    相关文章

      网友评论

        本文标题:Linux目录操作

        本文链接:https://www.haomeiwen.com/subject/ntmwrftx.html