Shell
Linux:循環重命名文件,同時僅針對特定字元的第一個實例
該執行緒(https://superuser.com/questions/659876/how-to-rename-files-and-replace-characters)已被證明是豐富的,並且可以滿足我的需要,但我只需要替換第一個文件名中字元的實例。
我怎樣才能做到這一點:
for f in *:*; do mv -v "$f" $(echo "$f" | tr '.' '_'); done
僅用文件名替換
.
文件名中的第一個實例,例如:2022-10-07T071101.8495077Z_QueryHistory.txt
不幸的是,您嘗試的方法比它需要的更複雜,而且很脆弱(如果文件名包含某些特殊字元,它會中斷)。這是一個更簡單的方法,它依賴於參數擴展來轉換文件名:
for f in *; do mv -v -- "$f" "${f/./_}"; done # replace the first . for f in *; do mv -v -- "$f" "${f//./_}"; done # replace every .
這需要 bash、ksh 或 zsh 作為 shell:其他 shell,如 dash(這是 Ubuntu 的
/bin/sh
,因此常用於腳本編寫,但幾乎沒有互動使用)沒有${VARIABLE/PATTERN/REPLACEMENT}
參數擴展的形式。或者,您可以使用
prename
(apt install rename
):rename 's/\./_/' * # replace the first . rename 's/\./_/g' * # replace every .
autoload -U zmv # put this in your .zshrc zmv '*' '${f/./_}' # replace the first . zmv -W '*.*.*' '*_*.*' # replace the next-to-last . zmv '*' '${f//./_}' # replace every .
我的答案中的所有片段都會跳過名稱以點開頭的文件。