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號