Linux的shell命令处理文件和路径的一些方法

  本文记录一下shell命令处理文件和路径的一些方法,做个笔记:

  basename

    basename:提取路径中的文件名部分(去掉目录)
    例如:
    > basename a/b/c    # 输出:c
    > basename ../c     # 输出:c
    > basename /test    # 输出:test
    > basename /        # 输出:/

  dirname

    dirname:提取路径中的目录部分(去掉文件名)
    例如:
    > dirname a/b/c    # 输出:a/b
    > dirname /a/b/c   # 输出:/a/b
    > dirname ../c     # 输出:..
    > dirname .        # 输出:.
    > dirname /test    # 输出:/
    > dirname /        # 输出:/

  realpath

    realpath:解析符号链接并返回绝对路径(需安装 realpath,部分系统默认包含)
    例如(如果当前目录是:/home/user):
    > realpath file.txt                # 输出:/home/user/file.txt
    > realpath ./file.txt              # 输出:/home/user/file.txt
    > realpath ../file.txt             # 输出:/home/file.txt
    > realpath ..                      # 输出:/home
    > realpath .                       # 输出:/home/user
    > realpath ~                       # 输出:/home/user
    > realpath /home/user/file.txt     # 输出:/home/user/file.txt
    > realpath /                       # 输出:/

  注意realpath会检查目录是否存在,不存在将会报错,如果不想它报错,需要使用-m参数,例如:

    > realpath /a/b        # 如果/a/b目录存在在,那么会报错
    > realpath -m /a/b     # 加上-m参数后不报错,只是输出

  readlink

    readlink:解析符号链接的真实路径
        -e 选项递归解析,要求其它所有的符号链接指向都存在
        -f 选项递归解析,除了最后一个符号链接外,要求其它所有的符号链接指向都存在
        -m 选项递归解析,允许其它所有的符号链接指向都不存在
    例如:
    > readlink /bin/sh          # 输出:dash
    > readlink -e /bin/sh       # 输出:/usr/bin/dash
    > readlink -e /bin1/sh      # 输出:
    > readlink -e /bin/sh1      # 输出:
    > readlink -f /bin/sh       # 输出:/usr/bin/dash
    > readlink -f /bin1/sh      # 输出:
    > readlink -f /bin/sh1      # 输出:/usr/bin/sh1
    > readlink -m /bin/sh       # 输出:/usr/bin/dash
    > readlink -m /bin1/sh      # 输出:/bin1/sh
    > readlink -m /bin/sh1      # 输出:/usr/bin/sh1

  stat

    stat:显示路径的详细信息(如权限、大小等)
    例如:
    > stat demo.sh
    输出:
      File: demo.sh
      Size: 221             Blocks: 8          IO Block: 4096   regular file
    Device: fd00h/64768d    Inode: 524496      Links: 1
    Access: (0664/-rw-rw-r--)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
    Access: 2025-04-23 19:46:23.852301530 +0800
    Modify: 2025-04-23 19:46:19.196299626 +0800
    Change: 2025-04-23 19:46:19.196299626 +0800
     Birth: -

  test

    test:对文件或者目录进行校验,判断文件及目录是否存在,等价写法可以使用中括号代替
        -e 选项用于指定文件或者目录是否存在
        -d 选项用于指定目录是否存在
        -f 选项用于指定文件是否存在
    例如:
    > test -e /usr/bin/dash && echo "Exists"        # 等价写法:[ -e /usr/bin/dash ] && echo "Exists" 
    > test -f /usr/bin/dash && echo "Exists"        # 等价写法:[ -f /usr/bin/dash ] && echo "Exists"  
    > test -d /usr/bin && echo "Exists"             # 等价写法:[ -d /usr/bin ] && echo "Exists" 

  mkdir

    mkdir:创建一个或者多个目录
        -p 选项指定如果目录存在,则使用,不存在则创建
    例如:
    > mkdir a/b/c            # a目录或者a/b目录不存在,则报错
    > mkdir a/b/c            # a/b/c目录已经存在,则报错
    > mkdir -p a/b/c         # a目录或者a/b目录不存在,或者a/b/c目录已经存在,都可以运行

  touch

    touch:用于创建新的空文件或更新现有文件的访问和修改时间
        -d 选项用于指定时间
        -a 选项用于指定只更新访问时间(Access Time)
        -m 选项用于指定只更新修改时间(Modification Time)
        -r 选项用于用指定的文件的时间来更新
    例如:
    > touch myFile.txt                            # 创建一个文件
    > touch -d "2025-05-01 12:00" myFile.txt      # 更新myFile.txt的访问时间和修改时间
    > touch -d "2025-05-01 12:00" -a myFile.txt   # 只更新myFile.txt的访问时间
    > touch -d "2025-05-01 12:00" -m myFile.txt   # 只更新myFile.txt的修改时间
    > touch -r file.txt -m myFile.txt             # 使用file.txt的时间来更新myFile.txt的访问时间和修改时间

  namei

    namei:显示路径中每一级的详细信息(如符号链接指向)
    例如:
    > namei /bin/sh
    输出:
    f: /bin/sh
     d /
     l bin -> usr/bin
       d usr
       d bin
     l sh -> dash
       - dash

  总结

  先写这么多吧,后面遇到了再加进来吧。

  其实这些命令可以组合,比如,我们要拿到当前的目录名称,或者当前用户home目录名称,或者指定文件的目录名称,可以这么写  

    # 获取当前目录名称
    basename `realpath .`
    # 获取当前用户home目录名称
    basename `realpath ~`
    # 获取指定文件所在的目录名称
    basename `realpath ~/demo | xargs dirname`

 

posted @ 2025-08-26 20:04  没有星星的夏季  阅读(22)  评论(0)    收藏  举报