Linux:在循环中重命名文件,同时仅针对特定字符的第一个实例

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

答案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

使用Perl 的rename命令行

    rename -n 's/\./_/' ./2022-10-07T071101.8495077Z_QueryHistory.txt

当输出看起来令人满意时删除-n(又名)。dry-run

相关内容