Bash

在bash中的for循環期間為文件名添加後綴

  • July 24, 2020

這可能已經被問過了,但現有的答案對我來說沒有意義。我正在對文件夾中的多個 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

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