首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Shell 腳本:取得目錄下所有指定副檔名檔案並以逗號分隔輸出

     編輯:程式設計綜合問答

需求背景

在撰寫控制檔或部署腳本時,常需要將某目錄下所有特定類型(如 .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 '' 組合妥善處理特殊檔名,適合整合至自動化部署或資料處理流程中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved