Bash
在bash中的for循環期間為文件名添加後綴
這可能已經被問過了,但現有的答案對我來說沒有意義。我正在對文件夾中的多個 CSV 文件執行循環。這個文件夾也有非 csv 文件,因此我必須明確指定 csv 文件。我正在使用 awk、cut 等以多種方式修改 csv 文件。完成後,我想將輸出重定向到名稱稍作修改的新 csv 文件,如下所示:
TLC_2017.csv > TLC_2017_prepped.csv
這是一個MWE:
for file in TLC*.csv; do cut -d, -f2- ${file} > ${file}_prepped done
問題是我正在獲取名稱為
TLC_2017.csv_prepped
. 換句話說,後綴被添加到文件副檔名而不是名稱中。如何將後綴添加到文件名而不是副檔名?如果現有問題的答案解決了我的問題,請不要只連結到它,還要提供一些解釋,以便我弄清楚。謝謝!
for file in TLC*.csv; do cut -d, -f2- "${file}" > "${file%.*}_prepped.csv" done
${file%.*}
刪除最後一個點之後的所有內容$file
。如果要刪除第一個點之後的所有內容,則可以使用%%
.同樣,
${file#*.}
(${file##*.}
) 刪除第一個(最後一個)點之前的所有內容。閱讀更多參數擴展,Bash 手冊。
請記住,始終引用您的變數。您可以使用它
shellcheck
來幫助您調試腳本。它會警告您未引用的變數。如果遍歷具有不同副檔名的文件,則目標文件副檔名不能像上面那樣硬編碼,所以
${file##*.}
需要。作為最小範例,您可以在空的測試目錄中嘗試,這會_prepped
復製到每個帶有副檔名的文件:touch A.file.txt B.file.dat C_file.csv D_file.ko E for file in *.*; do noext=${file%.*} ext=${file##*.} cp "$file" "${noext}_prepped.${ext}" done
執行後,
$ ls A.file_prepped.txt A.file.txt B.file.dat B.file_prepped.dat C_file.csv C_file_prepped.csv D_file.ko D_file_prepped.ko E