Shell

Linux:循環重命名文件,同時僅針對特定字元的第一個實例

  • October 7, 2022

該執行緒(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 .

或者,您可以使用zshzmv

autoload -U zmv   # put this in your .zshrc
zmv '*' '${f/./_}'        # replace the first .
zmv -W '*.*.*' '*_*.*'    # replace the next-to-last .
zmv '*' '${f//./_}'       # replace every .

我的答案中的所有片段都會跳過名稱以點開頭的文件。

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