外壳:zsh
大家好,我正在尝试快速更改文件的文件扩展名,例如在 DOS 中。
我确实发现了这个问题(有点)它仍然没有回答这个问题: Rename multiple files with mv to change the extension
我想更改远离我的特定目录上的文件扩展名,pwd
所以当我这样做时,我mv
不想再次重新键入同一目录,即:
mv /Users/dir/dir1/moredir/long/foo.txt /Users/dir/dir1/moredir/long/foo.yaml
像我这样的 n00b 只会假设您可以转到 /Users/dir/dir1/moredir/long/foo.txt *.yaml,但事实并非如此。
有什么简单的方法可以实现这一目标吗?
非常感谢您,并祝您周末愉快!
对于单个文件,可以使用大括号展开构造一个命令行来重命名一个文件,其中文件名只有一部分改变。
一般语法是,它在运行之前扩展为。
mv UNCHANGED1{OLD,NEW}UNCHANGED2
mv UNCHANGED1OLDUNCHANGED2 UNCHANGED1NEWUNCHANGED2
mv
对于多个文件,zsh 函数
zmv
提供了方便的方法来移动和重命名文件。把它放在你的.zshrc
,或者在你想使用的每个会话中从命令行运行它zmv
:然后,要更改当前目录中文件的扩展名,您可以运行其中任何一个。请注意,您需要在参数周围加上单引号,因为
*
and$
需要在内部解释,zmv
而不是在调用zmv
.要更改另一个目录中文件的扩展名,而不必重复目录路径:
在替换文本中:
$f
是整个源路径。:r
是一个历史修饰符,它从文件名中删除扩展名。$1
是源模式中括号中的第一组。括号中的组不能包含目录分隔符(有一个例外,此处不适用)。-w
标志会自动将每个通配符放在一个组中。-W
标志使*
替换文本中的每个都代表源模式中的任何相应*
匹配项。(还有其他几种工具可以做到这一点,但它们不是大多数 Unix 变体(包括 macOS)的默认安装的一部分。由于您使用的是 zsh,因此请利用 zmv,它的工作非常出色。)
要将单个文件重命名
foo.txt
到foo.yaml
目录/Users/dir/dir1/moredir/long
中,您可以先进入该目录,然后运行mv
:或者,您可以使用扩展为源和目标路径名的大括号扩展:
以上将扩展为完整的命令
...在外壳调用之前
mv
。这显然只适用于文件在重命名后应保留在同一目录中。