在bash中使用正则表达式复制和重命名多个文件

jlc*_*lin 11 regex bash copy rename

我有一个文件结构,看起来像:

A/
    2098765.1ext
    2098765.2ext
    2098765.3ext
    2098765.4ext
      12345.1ext
      12345.2ext
      12345.3ext
      12345.4ext

B/
    2056789.1ext
    2056789.2ext
    2056789.3ext
    2056789.4ext
      54321.1ext
      54321.2ext
      54321.3ext
      54321.4ext
Run Code Online (Sandbox Code Playgroud)

我需要重命名所有以开头的文件20与启动10; 即,我需要重命名B/2022222.1extB/1022222.1ext

我已经看到了许多关于重命名多个文件的其他问题,但似乎无法使其适用于我的情况.只是为了看看我是否能在我实际尝试复制/重命名之前弄清楚我在做什么:

for file in "*/20?????.*"; do
    echo "{$file/20/10}";
done
Run Code Online (Sandbox Code Playgroud)

但我得到的只是

{*/20?????.*/20/10}
Run Code Online (Sandbox Code Playgroud)

有人能告诉我怎么做吗?

Exp*_*lls 20

你只需要一点不正确的语法:

for file in */20?????.*; do mv $file ${file/20/10}; done
Run Code Online (Sandbox Code Playgroud)
  1. 从参数中删除引号in.否则,不会发生文件名扩展.
  2. $在替代应该去支架


Hai*_* Vu 10

这是一个使用find命令的解决方案:

find . -name '20*' | while read oldname; do echo mv "$oldname" "${oldname/20/10}"; done
Run Code Online (Sandbox Code Playgroud)

这个命令实际上并不是你的出价,它只打印出应该做的事情.查看输出,如果您满意,请删除该echo命令并将其运行为真实.