Linux
查找和組合與復雜名稱模式匹配的文件的命令
我的 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
我怎樣才能 -
查找所有客戶、所有日期的所有文件,這些文件遵循模式 EDW_Infile_ {3 到 8 個字節的任何名稱} Daily_Activity {Any Date} .csv
每個文件都包含一個標題。如何將所有這些合併到一個文件中並且只有一個標題
為了更具體地回答,我將我的 zsh 知識推了一下,以防您無法控製文件名並且文件名為 like
EDQ_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
從數組中的第一個文件中取出第一行;然後第二個命令遍歷所有文件並刪除第一行(預設將剩餘部分列印到標準輸出)。