这个线程(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
答案1
不幸的是,您尝试的方法比它需要的更复杂,而且脆弱(如果文件名包含某些特殊字符,它就会崩溃)。这是一个更简单的方法,依赖于参数扩展转换文件名:
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 .
我的答案中的所有片段都会跳过名称以点开头的文件。
答案2
rename -n 's/\./_/' ./2022-10-07T071101.8495077Z_QueryHistory.txt
当输出看起来令人满意时删除-n
(又名)。dry-run