Linux

查找和組合與復雜名稱模式匹配的文件的命令

  • February 12, 2019

我的 Linux 目錄包含文件轉儲,它們看起來像:

EDW_Infile_ABC_Daily_Activity_20190204.csv
EDW_Infile_ABC_Daily_Activity.zip
EDW_Infile_PQRInc_Daily_Activity_20190204.csv
EDW_Infile_PQRInc_Daily_Activity_zip
EDW_Infile_ABC_Daily_Payment_20190204.csv
EDW_Infile_PQRInc_Daily_Payment_20190204.csv
EDW_Infile_ABC_Daily_Status_20190204.csv
EDW_Infile_PQRInc_Daily_Status_20190204.csv

這些文件遵循一些常見的名稱模式,例如

EDW_Infile_*<3 to 8 bytes company name>*_Daily_Activity_*YYYYMMDD*.csv
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Payment_*YYYYMMDD*.csv
EDW_Infile_*<3 to 8 bytes company name>*_Daily_Status_*YYYYMMDD*.csv

我怎樣才能 -

  1. 查找所有客戶、所有日期的所有文件,這些文件遵循模式 EDW_Infile_ {3 到 8 個字節的任何名稱} Daily_Activity {Any Date} .csv

  2. 每個文件都包含一個標題。如何將所有這些合併到一個文件中並且只有一個標題

為了更具體地回答,我將我的 zsh 知識推了一下,以防您無法控製文件名並且文件名為 likeEDQ_Infile_some uninteresting stuff here_Daily_Activity_junk here.csv並且不想使用*萬用字元。

要收集文件名列表…

遵循模式 EDW_Infile_{3 到 8 字節任何名稱}Daily_Activity{任何日期}.csv

我會在 zsh 中設置這個 extended_glob 模式(不要輸入$– 那是 shell 提示符):

$ set -o extended_glob
$ files=(EDW_Infile_?(#c3,8)_Daily_Activity_[[:digit:]](#c8).csv)

除了純文字之外,模式是:

  • ?– 任何(單個)字元
  • (#c3,8)– 需要 3 到 8 個字元,包括 3 到 8 個字元
  • [[:digit:]]– 需要一個數字
  • (#c8)– 需要八個

請參閱以下列表:

$ print -l $files
EDW_Infile_ABC_Daily_Activity_20190204.csv
EDW_Infile_PQRInc_Daily_Activity_20190204.csv

到那時…

將它們全部合併到一個文件中,並且只有一個標題

{ head -1 "${files[1]}"; for f in $files; do sed 1d "$f"; done; } > output.csv

這將兩個命令分組並將它們的輸出重定向到output.csv. 第一個命令 ,head從數組中的第一個文件中取出第一行;然後第二個命令遍歷所有文件並刪除第一行(預設將剩餘部分列印到標準輸出)。

引用自:https://unix.stackexchange.com/questions/500013