单行 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 \;
给定文件和文件夹结构:
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 \;