我在 Unix 服務器中有一些具有相同檔案名模式的檔案。
示例:示例:
ABC DE FGH IJKL 04012022.csv
ABC DE FGH IJKL 04022022.csv
預期輸出:
ABC_DE_FGH_IJKL_04012022.csv
ABC_DE_FGH_IJKL_04022022.csv
這是我嘗試過的。但是在 mv 命令中出現錯誤,因為它試圖一次重命名兩個檔案。
for file in ls ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(ls ABC\ DE\ FGH\ IJKL\ ????????.csv | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_"$date_part.csv
#Renaming file using mv command
mv ABC\ DE\ FGH\ IJKL\ ????????.csv $csv_file_nm
done
uj5u.com熱心網友回復:
顯示的代碼被嚴重破壞:
for file in ls ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(ls ABC\ DE\ FGH\ IJKL\ ????????.csv | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_"$date_part.csv
#Renaming file using mv command
mv ABC\ DE\ FGH\ IJKL\ ????????.csv $csv_file_nm
done
要使用這個想法(這不是一種很好的處理方式,但是......),您需要"$file"在回圈中使用而不是重復ls操作:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
#Extracting date part separately
date_part=$(echo "$file" | cut -c 17-24)
#Appending date part to file
csv_file_nm="ABC_DE_FGH_IJKL_$date_part.csv"
#Renaming file using mv command
mv "$file" "$csv_file_nm"
done
該腳本使用通配符而不是ls生成檔案名——我已經ls從for行中洗掉了一個流浪者。您可能打算為file in $(ls …)或可能為file in `ls …` — 寫作,但這不是問題所在。ls也不推薦處理的輸出。
但是,由于您想用下劃線替換空格,因此更直接的操作方式是:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
csv_file_nm=$(echo "$file" | sed 's/ /_/g')
mv "$file" "$csv_file_nm"
done
或者,如果您的 shell 是 Bash(并且足夠新),那么:
for file in ABC\ DE\ FGH\ IJKL\ ????????.csv
do
mv "$file" "${file// /_}"
done
或者,如果您在系統上有基于 Perl rename(有時稱為prename)的命令,那么:
rename 's/ /_/g' "ABC DE FGH IJKL "????????.csv
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/461205.html
