在撰寫控制檔或部署腳本時,常需要將某目錄下所有特定類型(如 .csv)的檔案名稱蒐集起來,並以逗號分隔的格式寫入設定檔中。本文提供一個可重複使用的 Shell 腳本範例,接受目錄路徑與副檔名作為參數,自動產生所需格式。
#!/bin/sh
# 參數檢查
if [ $# != 2 ]; then
echo "Usage: $0 "
echo "Example: $0 /data/csv csv"
exit 1
fi
dir_path=$1
file_suffix=$2
echo "Directory: ${dir_path}"
echo "Suffix: ${file_suffix}"
output=""
# 使用 find 避免檔名含空白時的問題
while IFS= read -r -d '' file; do
# 只取檔名(不含路徑)
filename=$(basename "$file")
if [ -z "$output" ]; then
output="${filename}"
else
output="${output},${filename}"
fi
done < <(find "${dir_path}" -maxdepth 1 -type f -name "*.${file_suffix}" -print0)
echo "file_list=${output}"
$1(目錄路徑)與 $2(副檔名),提高通用性。find -print0 配合 read -d '': 可正確處理檔名包含空白、換行等特殊字元的情況,比傳統 for file in $(ls ...) 更健壯。-maxdepth 1: 只搜尋指定目錄下第一層,遞迴搜尋請移除此參數。file_list=檔名1,檔名2,... 形式輸出,可直接導向控制檔或作為變數引用。# 將 /home/user/data 下所有 .csv 檔名以逗號分隔輸出
./list_csv.sh /home/user/data csv
# 輸出:file_list=20150701.csv,abcd.csv,report.csv
find 後加管線 | sort -z。-maxdepth 1 即可包含子目錄。-name 改為 -iname。這個腳本以標準 POSIX Shell 撰寫,相容性高,透過 find 與 read -d '' 組合妥善處理特殊檔名,適合整合至自動化部署或資料處理流程中。