递归批处理重命名



我有几个文件夹,其中包含一些我想重命名的文件

Foo'Bar - Title

Title

我使用的是OS X 10.7。我看过其他解决方案,但没有一个能很好地解决递归问题。

有什么建议吗?

您的问题有两个部分:查找要递归操作的文件,并重命名它们。

对于第一个,如果所有内容都正好比当前目录低一级,您可以只列出当前目录中每个目录的内容(如上面的 Mattias Wadman 的回答(,但更一般(可能更容易理解,引导(,你可以使用 find 命令。

对于第二个,您可以使用 sed 并弄清楚如何正确引用和管道(您最终肯定会学习(,但使用 rename 命令要简单得多。不幸的是,这个不是内置在Mac上的,但是您可以使用Homebrew之类的方法安装它,或者只是下载perl脚本并sudo install -m755 rename /usr/local/bin/rename

因此,您可以这样做:

find . -exec rename 's|[^/]* - ||' {} +

如果要执行"试运行"以确保其正确,请添加"-n"标志以重命名:

find . -exec rename -n 's|[^/]* - ||' {} +

要了解它是如何工作的,你真的应该阅读查找教程和重命名手册页,但分解它:

  • find .的意思是"递归查找当前目录下的所有文件"。
  • 您可以添加其他测试来过滤内容(例如,如果您想跳过常规文件以外的所有内容,-type f,或者如果您只想更改以"标题"结尾的文件,则添加"-name '*Title"(,但这对于您的使用不是必需的。
  • -exec...... + 表示对找到的文件进行批处理,并尽可能多地传递这些文件,以代替"..."中显示的命令中的任何{}
  • rename 's|[^/]* - ||' {} 表示对于 {} 中的每个文件,将 perl 表达式s|[^/]* - ||应用于文件名,如果结果不同,则将其重命名为该结果。
  • s|[^/]* - ||表示匹配正则表达式 ' [^/]* - ' 并将匹配替换为 ''(空字符串(。
  • [^/]* - 表示匹配任何以 ' - ' 结尾的非斜杠字符字符串。因此,在" ./A/FooBar - Title "中,它将与" FooBar - "匹配。

我应该提到,当我有这样复杂的事情要做时,如果经过几分钟和几次尝试使用 find/sed/awk/rename/etc 来正确处理它,我仍然没有得到它,我经常只是用 Python 和 os.walk 命令性地编写它。如果你了解Python,这可能更容易理解(虽然更冗长,不那么简单(,并且更容易修改为其他用例,所以如果你有兴趣,请问一下。

试试这个:

ls -1 * | while read f ; do mv "$f" "`echo $f | sed 's/^.* - //'`" ; done

我建议您在运行mv之前添加一个echo,以确保命令看起来正常。正如 abarnert 在评论中指出的那样,此命令一次仅适用于一个目录。

各种命令的详细说明:

ls -1 *将为当前目录中的每个文件(和目录(输出一行(. -files除外(。因此,这将扩展到 ls -1 file1 file2 ...-1ls 告诉它只列出文件名和每行一个文件。

然后将输出通过管道传输到while read f ; ... ; doneread f返回零时循环,直到到达文件末尾。 read f一次从标准输入(在本例中是 ls -1 ... 的输出(读取一行,并将其存储在指定的变量中,在本例中为 f .

在 while 循环中,我们运行一个带有两个参数的 mv 命令,第一个"$f"作为源文件(注意引号以处理带空格等的文件名(,第二个目标文件名使用 sed 和 ' (反引号(执行所谓的命令替换,它将调用反引号内的命令并将其替换为标准输出的输出。

echo $f | sed 's/^.* - //'将当前文件$f管道传输到 sed,该 sed 将与正则表达式匹配并执行替换(s/ 中的s(并在标准输出上输出结果。正则表达式是^.* -它将从字符串^的开头匹配(称为锚定(,然后.*任何字符后跟-并将其替换为空字符串(// 之间的字符串(。

我知道

你要求批量重命名,但我建议你使用Automator。它运行良好,如果您将其创建为服务,您将在上下文菜单中选择该选项:)

经过一些试验和错误,我遇到了这个解决方案,它对我解决了同样的问题。

find <dir> -name *.<oldExt> -exec rename -S .<oldExt> .<newExt> {} ;

基本上,我利用查找和重命名实用程序。这里的诀窍是弄清楚重命名的"{}"(表示需要通过重命名处理的文件(的位置。

P.S. 重命名不是内置的 Linux 实用程序。我使用OS X并使用自制软件来安装重命名。

最新更新