在子文件夹中使用zmv重命名文件

7
假设我想使用zmv将文件夹中所有子文件夹内的所有文件从foo.txt重命名为bar.txt。我已经尝试过zmv '**/foo.txt' 'bar.txt',但这会在根文件夹中创建bar.txt。如何保持文件在相应的子文件夹中?
1个回答

11
你需要在目标中引用目录部分。你可以通过在括号中放置通配符并使用$1来引用与括号分组匹配的部分来实现。通配符**有点特殊,需要将括号放在**/周围,不多也不少。
zmv '(**/)foo.txt' '${1}bar.txt'
你可以使用-w标志,使每个通配符自动转换为括号组。
zmv -w '**/foo.txt' '${1}bar.txt'

或者您可以使用-W标志,并在替换文本中使用通配符 — 使用此标志,替换文本中的通配符将变为$1$2等。

zmv -W '**/foo.txt' '**/bar.txt'

或者,您可以使用$f来引用源路径。

zmv '**/foo.txt' '$f:r.txt'

zmv -W 版本非常出色,完全按照预期工作。 - Jay Dorsey
Zmv 有没有创建中间目录的方法?例如,我想从 src/**/foo.txt 移动到 dst/**/bar.txt,所以 dst/ 下的子目录可能不存在。我目前的解决方法是在 zmv 前使用 rsync - Franklin Yu
1
@FranklinYu https://unix.stackexchange.com/questions/59112/preserve-directory-structure-when-moving-files-using-find/59159#59159 - Gilles 'SO- stop being evil'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接