替换多个目录中多个文件中的字符

替换多个目录中多个文件中的字符

在我的 Qnap 上,我尝试将多个目录中的文件名中的“xyz”替换为“abc”。作为一个unix/linux新手,我尝试了以下命令:

for f in *xyz*; do mv -i "$f" "${f//xyz/abc}"; done

这对于目录中的文件非常有效,但对于子目录中的文件不起作用。如何更改上述内容以使其也适用于子目录中的文件?

答案1

正如评论中所讨论的,OPbash在其 QNAP 设备上使用 shell,但由于它是 Bash 3,因此无法使用 globstar,因为在 Bash 4.0 中添加了 in 。在这种情况下,find这是可能的解决方案之一。

例子:

首先,创建一个示例目录结构并创建XYZ文件:

$ mkdir -p 1/2/3
$ touch  a_xyz_a 1/2/b_xyz_b 1/2/3/c_xyz_c

现在运行find+ mv

$ find . -name "*xyz*" -exec sh -c 'echo mv -i "$1" "${1//xyz/abc}";' sh {} \;
mv -i ./a_xyz_a ./a_abc_a
mv -i ./1/2/3/c_xyz_c ./1/2/3/c_abc_c
mv -i ./1/2/b_xyz_b ./1/2/b_abc_b

删除echo以实际执行mv

相关内容