使用 Bash 獲取檔名和副檔名

Ozair Malik 2023年1月30日 2022年5月14日
  1. 使用 Bash 獲取檔名和副檔名
  2. 執行 Bash 檔案以獲取檔名和副檔名
使用 Bash 獲取檔名和副檔名

近年來,Bash 指令碼變得非常流行,無論是用於你的日常 Linux 管理任務還是整個 DevOps 自動化任務。

假設你發現自己想在 bash 指令碼中分別提取檔名及其副檔名。例如,有一個名為 server.py 的 python 檔案。我們希望通過分隔名稱 server 和副檔名 py 將該字串分成兩部分。

使用 Bash 獲取檔名和副檔名

為了演示目的,我們編寫了一個 bash 指令碼。如果需要,你可以在指令碼中的任何位置使用此程式碼。

  • 首先,我們將檢查使用者是否提供了正確的引數。下面的程式碼片段使用了一個 if 語句,使 = 等於 0 0,這意味著沒有提供任何引數;在這種情況下,我們將使用 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 或命令提示符以避免任何與許可權相關的問題。

相關文章 - Bash File