在Linux Shell腳本中,basename
和?dirname
是兩個非常實用的命令,常用于處理文件路徑和名稱。本文將詳細介紹這兩個命令的用法,并提供豐富的示例代碼,以幫助您更好地理解和應用它們。
一、basename命令
1.1 基本用法
basename
命令用于去除路徑信息,只保留文件名或目錄名。其基本語法如下:
basename [OPTION] NAME [SUFFIX]
NAME
:要處理的路徑名。SUFFIX
:可選,用于去除文件名中的后綴。
1.2 示例
1.2.1 去除路徑信息
#!/bin/bashfile_path="/usr/local/bin/script.sh"
file_name=$(basename "$file_path")
echo "File name: $file_name"
?
輸出:
File name: script.sh
1.2.2 去除后綴
#!/bin/bashfile_path="/usr/local/bin/script.sh"
file_name=$(basename "$file_path" .sh)
echo "File name without suffix: $file_name"
?
輸出:
File name without suffix: script
1.2.3 批量處理文件名
#!/bin/bashfor file in /usr/local/bin/*.sh; dobase_name=$(basename "$file" .sh)echo "Base name: $base_name"
done
?
二、dirname命令
2.1 基本用法
dirname
命令用于去除文件名,只保留路徑信息。其基本語法如下:
dirname NAME
NAME
:要處理的路徑名。
2.2 示例
2.2.1 獲取路徑信息
#!/bin/bashfile_path="/usr/local/bin/script.sh"
dir_path=$(dirname "$file_path")
echo "Directory path: $dir_path"
?
輸出:
Directory path: /usr/local/bin
?
2.2.2 結合basename使用
#!/bin/bashfile_path="/usr/local/bin/script.sh"
dir_path=$(dirname "$file_path")
base_name=$(basename "$file_path")
echo "Directory path: $dir_path"
echo "File name: $base_name"
?
輸出:
Directory path: /usr/local/bin
File name: script.sh
?
2.2.3 批量處理文件路徑
#!/bin/bashfor file in /usr/local/bin/*.sh; dodir_path=$(dirname "$file")echo "Directory path: $dir_path"
done
?
三、實踐應用
3.1 文件備份腳本
一個簡單的文件備份腳本,使用?basename
和?dirname
處理文件名和路徑。
#!/bin/bashsrc_file="/usr/local/bin/script.sh"
backup_dir="/backup"# 獲取文件名和目錄路徑
file_name=$(basename "$src_file")
dir_path=$(dirname "$src_file")# 創建備份目錄結構
mkdir -p "$backup_dir/$dir_path"# 復制文件到備份目錄
cp "$src_file" "$backup_dir/$dir_path/$file_name"echo "File $src_file has been backed up to $backup_dir/$dir_path/$file_name"
?
3.2 日志文件分離
一個將日志文件按日期分離的腳本,使用?basename
和?dirname
處理文件路徑和名稱。
#!/bin/bashlog_file="/var/log/app.log"
archive_dir="/var/log/archive"# 獲取當前日期
current_date=$(date +%Y-%m-%d)# 獲取文件名和目錄路徑
file_name=$(basename "$log_file")
dir_path=$(dirname "$log_file")# 創建歸檔目錄
mkdir -p "$archive_dir/$current_date"# 復制并重命名日志文件
cp "$log_file" "$archive_dir/$current_date/${file_name}_$current_date"echo "Log file $log_file has been archived to $archive_dir/$current_date/${file_name}_$current_date"