如何在终端中批量更改一组文件名的第一部分(编辑:OS X)?

How can I batch change the first part of a group of files' names in Terminal (EDIT: OS X)?

我有一组带有固定前缀的文件,我想在终端中同时更改所有文件的前缀。所以假设我想改变这个组

01-here.md
01-is.md
01-an.md
01-example.md

至此

02-here.md
02-is.md
02-an.md
02-example.md

我正在寻找与 mv 01*.md 02*.md 类似的内容,但没有成功。仔细研究后,我发现了一种使用 finder 完成相同任务的简单方法,但 finder 显然是为慢吞吞的人和失败者准备的,所以我仍然想知道该怎么做 "for realz."

编辑:使用 OS X

你可以尝试这样的事情(编辑后的答案):

INITIAL_SUFFIX="01-";
FINAL_SUFFIX="02-";

for file in $(ls -1 "$INITIAL_SUFFIX"*); do
        if [ -f $file ]; then
                mv $file "$FINAL_SUFFIX${file#*-}";
        fi;
done

对于您的示例情况,尝试

for f in *.md; do echo mv "$f" "${f/2/3}"; done

(注意:echo 只会告诉你会发生什么,删除它以实际重命名文件)。可以在 here 中找到对这段摘录的很好解释。

另一方面,您也可以在 Applescript 或 Automater 中执行此操作,这两者都提供了大量用于批量重命名等功能。

为此我有一个名为 rename 的脚本,但如果我没有,我会使用循环,如下所示:

for f in 01-*.md; do mv "$f" "${f/01/02}"; done

最简单、最灵活的方法是使用 Perl rename 脚本。在 OSX 上,可以使用 homebrew 轻松安装,使用

brew install rename

那么你可以这样做:

rename 's/01/02/' *md

如果你只想看看它会做什么,而不实际做任何事情,请使用 --dry-run 选项,如下所示:

rename --dry-run 's/01/02/' 01*md

输出

'01-an.md' would be renamed to '02-an.md'
'01-example.md' would be renamed to '02-example.md'
'01-here.md' would be renamed to '02-here.md'
'01-is.md' would be renamed to '02-is.md'

它也不会覆盖任何文件,如果它们计算出相同的结果文件名并且可以做很多很多更复杂的重命名。