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`
一个专注于.NetCore的技术小白

浙公网安备 33010602011771号