单行 bash 命令将名称为 A 的所有文件重命名为名称 B

Single line bash command to rename all files with name A to name B

给定文件和文件夹结构:

test
├── a
│   └── hans.x
├── b
│   └── hans.x
└── c
    └── hans.x

我想使用单行bash命令将所有文件“hans.x”重命名为“peter.x”。

期望的结果:

test
├── a
│   └── peter.x
├── b
│   └── peter.x
└── c
    └── peter.x

我查看了很多关于 SO 的解决方案,发现很多解决方案展示了如何将文件“peter.x”重命名为“peter.x_somethingmore”,但没有出现上述情况。

我尝试了以下方法:

find . -type f -name 'hans.x' -print0 | xargs --null -I{} mv {} "$(dirname "{}")"peter.x

但不幸的是,这会导致以下执行:

mv ./test/a/hans.x .peter.x
mv ./test/c/hans.x .peter.x
mv ./test/b/hans.x .peter.x

$(...) 在执行 xargs 之前展开。您想 运行 将其全部放在解析行时创建的子外壳中:

   ... | xargs -0n1 sh -c 'mv "" "$(dirname "")"/hans.y' _

使用 GNU find,您可以使用 -execdir:

find -type f -name 'hans.x' -execdir mv {} peter.x \;