递归批量重命名(Recursive batch rename)

2019-10-17 00:28发布

我有一些文件,几个文件夹,我想从重命名

Foo'Bar - Title

Title

我使用的是OS X 10.7。 我看其他的解决方案,但没有以解决递归很好。

有什么建议么?

Answer 1:

尝试这个:

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

我建议你添加echo之前mv运行它,以确保命令看行之前。 而作为abarnert在评论中提到此命令将只在一个时间一个目录工作。

各种命令的详细的说明:

ls -1 *在当前目录中会输出用于每个文件(和目录)的线(除. -files)。 因此,这将被扩展ls -1 file1 file2 ...-1ls告诉它仅列出每行一个文件的文件名。

然后输出被管道输送到while read f ; ... ; done while read f ; ... ; done while read f ; ... ; done这同时将循环read f返回零,这确实直到它到达文件末尾。 read f在从标准输入(在这种情况下,从输出一次读取一条线ls -1 ... )并将其存储在指定的变量在此情况下f

在while循环中,我们运行一个mv命令有两个参数,第一个"$f"作为源文件(注意引号处理与空间等的文件名)和第二它采用SED和`(反引号)做的是目标文件名叫命令替换将调用反引号内的命令和与来自标准输出的输出代替它。

echo $f | sed 's/^.* - //' echo $f | sed 's/^.* - //'管道当前文件$f成的sed,将匹配正则表达式和做取代(的ss/和输出)在标准输出的结果。 正则表达式是^.* -将匹配从字符串的开头^任何字符(称为锚定),然后.*随后-并与空字符串(之间的字符串替换它// )。



Answer 2:

有两个部分问题的方法:查找文件递归操作上,和重命名它们。

对于第一个,如果一切正好是一个级别低于当前目录下,你可以列出当前目录下的每个目录中的内容(如在马蒂亚斯·瓦德曼的回答以上),但更普遍的(并且可能更容易理解,要引导),你可以只使用查找命令。

对于第二个,你可以使用sed和工作,如何获得报价和管道的权利(你现在应该最终学会),但它更易于使用的重命名命令。 不幸的是,这个人是不是内置在Mac,但你可以安装它,例如,自制,或者只是下载perl脚本和sudo install -m755 rename /usr/local/bin/rename

所以,你可以这样做:

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

如果你想要做一个“预演”,以确保它是正确的,添加“-n”标志来命名:

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

要了解它是如何工作的,你真的应该阅读找到教程,和重命名的联机帮助,但它分解:

  • find . 意思是“递归找到当前目录下的所有文件”。
  • 您可以添加额外的测试来筛选的东西(如-type f ,如果你想跳过一切,但普通文件,或`-name“*标题”如果你想只改变,在“标题”结尾的文件),但ISN “吨必要为您的使用。
  • -exec ... +意味着批量达找到的文件,并通过尽可能多的人尽可能地代替任何{}在出现的“...”命令。
  • rename 's|[^/]* - ||' {} rename 's|[^/]* - ||' {}用于在{每个文件},应用Perl表达式s|[^/]* - || 在文件名,并且,如果结果不同的是,其重命名为这一结果。
  • s|[^/]* - || 表示匹配正则表达式“ [^/]* - ”和替换匹配“”(空字符串)。
  • [^/]* -表示匹配的,与端部非斜杠字符的任意字符串“ - ”。 所以,在“ ./A/FooBar - Title ”,它会匹配“ FooBar - ”。

我要指出的是,当我有一些复杂,不喜欢这一点,如果几分钟后和一对夫妇试图得到它的权利与查找/ SED / AWK /重命名/等等,我还没有得到它,我经常只需用Python和os.walk代码势在必行它。 如果你知道Python的,这可能是您更容易理解(尽管更详细的和更少的简单),并更容易为你修改到其他使用情况,所以如果你有兴趣,问了点。



Answer 3:

我知道你要的批量重命名,但我建议你使用的Automator 。 它完美的,如果你把它创建为一个服务,你会在你的上下文菜单中选择:)



Answer 4:

一些试验和错误之后,我遇到了这个解决方案,为我工作,以解决同样的问题。

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

基本上,我利用查找和重命名工具。 这里的诀窍是搞清楚在哪里放置“{}”(这表示需要通过重命名处理的文件)命名的。

PS重命名是不是一个内置的Linux工具。 我与OS X做工和用自制安装重命名。



文章来源: Recursive batch rename