在我的 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
。