在 Linux 中递归重命名文件(更改扩展名)

end*_*ith 29 linux file-management command-line rename

对于数千个子文件夹中的数千个文件,如何递归地重命名目录中的所有文件,将一个文件扩展名更改为另一个?我看到很多命令几乎可以满足我的要求,但并不完全。

find . -name "*.andnav" -exec rename .andnav .tile {} \;
syntax error at (eval 1) line 1, near "."
Run Code Online (Sandbox Code Playgroud)

...

rename -nv 's/\.andnav$/\.tile/i' *.andnav
0.png.andnav renamed as 0.png.tile
Run Code Online (Sandbox Code Playgroud)

end*_*ith 36

弄清楚了

find . -name "*.andnav" -exec rename -v 's/\.andnav$/\.tile/i' {} \;
./0/0.png.andnav renamed as ./0/0.png.tile
./0/1.png.andnav renamed as ./0/1.png.tile
./1/0.png.andnav renamed as ./1/0.png.tile
./1/1.png.andnav renamed as ./1/1.png.tile
Run Code Online (Sandbox Code Playgroud)

当然在实际执行时删除 -v,否则会浪费时间显示所有文件


Gil*_*il' 23

使用 zsh:

autoload zmv
zmv -n '(**/)(*).andnav' '$1$2.tile'
Run Code Online (Sandbox Code Playgroud)

删除-n以实际执行重命名。

  • 很棒的答案! (3认同)

cYr*_*rus 18

就像是:

find . -name '*.andnav' -exec sh -c 'mv "$0" "${0%.andnav}.tile"' {} \;
Run Code Online (Sandbox Code Playgroud)

解释

以上开始遍历从当前工作目录 ( .)开始的目录树。每次文件名匹配模式*.andnav(例如,foo.andnav)时,将执行以下命令:

sh -c 'mv "$0" "${0%.andnav}.tile"' foo.andnav
Run Code Online (Sandbox Code Playgroud)

where $0isfoo.andnav并用so 基本上${0%.andnav}.tile替换.andnav后缀.tile

mv foo.andnav foo.tile
Run Code Online (Sandbox Code Playgroud)

  • 我只是想解释一下语法和行为——人们(像我一样!)可能不熟悉 bash 参数扩展 (2认同)