使用 Bash 獲取檔名和副檔名
Ozair Malik
2023年1月30日
2022年5月14日
近年來,Bash 指令碼變得非常流行,無論是用於你的日常 Linux 管理任務還是整個 DevOps 自動化任務。
假設你發現自己想在 bash 指令碼中分別提取檔名及其副檔名。例如,有一個名為 server.py
的 python 檔案。我們希望通過分隔名稱 server
和副檔名 py
將該字串分成兩部分。
使用 Bash 獲取檔名和副檔名
為了演示目的,我們編寫了一個 bash 指令碼。如果需要,你可以在指令碼中的任何位置使用此程式碼。
- 首先,我們將檢查使用者是否提供了正確的引數。下面的程式碼片段使用了一個
if
語句,使=
等於 00
,這意味著沒有提供任何引數;在這種情況下,我們將使用pwd
或我們當前的工作目錄作為預設引數。
#!/bin/bash
# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
cDir=$(pwd) # Setting the cDir variable to current directory
echo "[-] No directory provided!"
else
cDir=$1
fi
echo "[+] Setting the directory to $cDir"
- 接下來,我們檢查使用者提供的目錄是否存在。如果它不存在,我們將退出指令碼。
# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
echo "[-] Directory $cDir doesn't exist!"
exit
fi
- 現在,我們開始使用簡單的
ls
命令在allFile
變數中提取目錄中可用的檔案(當然,如果它有效),該命令在 Linux 和 Windows 作業系統中的 PowerShell 中執行。
# Main extraction:
allFile=`ls $cDir`
echo;
-
在這裡,我們檢查提供的路徑的最後一個值是否不是
/
,如果不是,我們將其新增到末尾以避免任何錯誤。 -
這不是通過使用
if
語句。${cDir: -1} != '/'
表示如果檔案結尾不是,那麼
在結尾處增加/
提供的路徑。
# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
cDir+='/'
fi
- 接下來,我們使用
for loop
和變數$allFile
遍歷資料夾中存在的所有內容。記得之前$allFile
的值為ls $cDir
。
# Iterating over everything in the folder
for item in $allFile; do
# Appending path to each file:
item="$cDir$item"
我們在迴圈中使用 -f
標誌檢查檢測到的檔案是否屬於 type file
。如果是這種情況,我們會從檔名中刪除點部分,例如副檔名部分。
- 最後,我們使用
echo
以我們想要的方式列印結果。
# Checking if current item is a file:
if [[ -f $item ]]; then
ext=`ls $item | rev | cut -d '.' -f 1 | rev`
file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
echo "File Name: $file_name -> Extension: $ext"
fi
- 此指令碼檢查特定目錄是否存在。如果目錄存在,它將提及所有檔案及其副檔名。
┌─[root@parrot]─[/home/user/Downloads]
└──╼ #./test2.sh
[-] No directory provided!
[+] Setting the directory to /home/user/Downloads
File Name: /home/user/Downloads/ExtraCredit_Sockets_Intro -> Extension: pdf
File Name: /home/user/Downloads/project -> Extension: sh
File Name: /home/user/Downloads/test2 -> Extension: sh
File Name: /home/user/Downloads/test -> Extension: txt
注意
我們在沒有提供任何目錄作為引數的情況下執行指令碼,因此它預設下載,即我的當前目錄,並提及該目錄中存在的所有檔名及其副檔名。
程式碼的每一行都有註釋,所以如果你有任何困惑,你可以檢查一下。
如果你想使用這個指令碼,這裡是它的完整版本。
#!/bin/bash
# Checking if arguments have been provided:
if [[ $# == 0 ]]; then
cDir=$(pwd) # Setting the cDir variable to current directory
echo "[-] No directory provided!"
else
cDir=$1
fi
echo "[+] Setting the directory to $cDir"
# Checking if the directory exists:
if [[ ! -d $cDir ]]; then
echo "[-] Directory $cDir doesn't exist!"
exit
fi
# Main extraction:
allFile=`ls $cDir`
echo;
# Checking if the last value of the path is '/' or not:
if [[ ${cDir: -1} != '/' ]]; then
cDir+='/'
fi
# Iterating over everything in the folder
for item in $allFile; do
# Appending path to each file:
item="$cDir$item"
# Checking if current item is a file:
if [[ -f $item ]]; then
ext=`ls $item | rev | cut -d '.' -f 1 | rev`
file_name=`ls $item | rev | cut -d '.' -f 2 | rev`
echo "File Name: $file_name -> Extension: $ext"
fi
done
執行 Bash 檔案以獲取檔名和副檔名
如果你是嘗試學習 bash 的新手並且不知道如何執行,請使用此程式碼;你所要做的就是建立一個帶有 .sh
副檔名的檔案,這意味著它是一個 bash 檔案。
之後,使用你選擇的終端導航到該目錄並鍵入 ./filename
,這將執行該檔案。
如果你使用的是 Windows 作業系統,請鍵入 bash file.sh
,它應該可以正常執行。
請記住在你的情況下使用指令碼的正確檔名。
許可權相關問題
注意
在執行指令碼時,你可能會遇到
許可權被拒絕
錯誤。你需要在終端中使用 chmod +x [檔名]
提供正確的許可權。
如果你使用的是 Windows,請以管理員身份執行 PowerShell 或命令提示符以避免任何與許可權相關的問題。