65.9K
CodeProject 正在变化。 阅读更多。
Home

为古怪的人重命名卷文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.47/5 (12投票s)

2008年9月19日

CPOL

11分钟阅读

viewsIcon

45137

downloadIcon

744

使用多文件重命名器重命名文件。

引言

多文件重命名器是我创建的一个简单的Windows Forms应用程序,旨在帮助我重命名数千个文件。它是一个你能想象到的最简单的程序,没有被大多数文件重命名工具中常见的复杂用户选项和其他垃圾所困扰。你可以用它做的事情有:

  • 替换文件名中的字符串(支持正则表达式)
  • 给文件名前添加前缀
  • 给文件名后添加后缀
  • 将文件名改为大写
  • 将文件名改为小写
  • 将文件名改为首字母大写(标题格式)
  • 在文件名中插入/递增数字
  • 包含一个简单的正则表达式编辑器

背景

你可能认识像我这样的人:有条不紊、强迫症、追求完美。那种看到事物不整齐就会明显情绪失控的人。这种“整洁”的强迫症在文件系统和目录层级结构方面会达到极致。例如,有人可能不会觉得一个存储MP3音乐文件的文件夹叫做“音乐”,其中每个文件都命名为类似下面这样有什么不对:

[artist] - [album] - [Track].mp3 
    (e.g. Megadeth - Rust In Peace - Take No Prisoners.mp3).

然而,对我个人而言,这是一种反自然的行为,因为在我看来,显而易见,曲目应该按以下方式排序:

[Genre]\[Artist]\[(Year) Album]\[Track]!

同样,包含媒体中心/Tivo录音的文件夹应该位于类似这样的目录中:

[Entertainment]\[Video]\[TV Recordings]\[Series]\[Season]\[Episodes]

不幸的是,我个人对文件名和目录的偏好不时会改变,这让我不得不重命名大量文件。这些年来,我记不清我用各种语言编写了多少脚本来重命名文件。然而,去年我不小心用静电放电到我用来存档代码的硬盘上,导致源代码灾难性丢失,一切都毁了。这场悲剧促使我重新开始,创建一个新的重命名工具。

让你的文件系统也患上强迫症

除非你能轻松浏览文件,否则你怎么会知道哪些文件需要强迫性地重命名?你肯定不会花几个小时在资源管理器中漫无目的地浏览文件夹,寻找那些命名不合逻辑的文件,对吗?不,那种操作是留给最痴迷的人的,比如一个不那么精通IT的我。你需要一个索引!

可怜的MS Windows“搜索”功能(我用“搜索”这个词很宽松)无法作为索引。它太受限制了。我通过让我的服务器每晚索引其共享上的所有文件并将该索引放在共享的根目录来一石二鸟。通过这样做,我可以在我“精神失常”地寻找命名不佳文件时浏览共享的整个文件系统,并且我的用户可以使用记事本或我们网络服务器上托管的脚本(支持正则表达式)搜索共享内容。

@echo off
echo Generating Indexes for Ebooks
dir /B /S \\baileyfs01\Files\EBooks\*.*  > 
          \\baileyfs01\Files\EBooks\e-books_db.txt

echo Generating Indexes for Applications
dir /B /S \\baileyfs01\Files\Applications\*.* > 
    \\baileyfs01\Files\Applications\applications_db.txt

echo Generating Indexes for Music
dir /B /S \\baileyfs01\Music\*.* > \\baileyfs01\Music\music_db.txt

echo Generating Indexes for Photos
dir /B /S \\baileyfs01\Files\"Digital Photos"\*.* > 
    \\baileyfs01\Files\"Digital Photos"\photos_db.txt

echo Generating Indexes for TV
dir /B /S \\baileyfs01\Files\Entertainment\Video\"TV Recordings"\*.* > 
    \\baileyfs01\Files\Entertainment\Video\"TV Recordings"\tv_db.txt

echo Generating Indexes Of User Downloads
dir /B /S \\baileyweb01\Downloads\*.* > \\baileyweb01\Downloads\udl_db.txt

有了你的索引,你现在可以有条不紊地浏览所有文件,并迅速做出命名标准方面的决定。一旦你确定了违反你惯例的文件,你就可以启动多文件重命名工具并适当地重命名它们。

使用程序/代码

代码没什么特别的,而且它肯定违反了传统的VISTA设计实践,就像大多数匆忙为个人使用编写的代码一样。使用程序非常简单。基本上,它是这样工作的:

  1. 导航到需要重命名文件的目录
  2. 在要重命名的文件旁边打勾
  3. 切换到“规则”选项卡并定义操作中使用的规则
  4. 点击“预览”按钮查看应用更改后的效果
  5. 应用更改

插入和递增数字

此工具最有用功能之一是数字递增功能。与正则表达式结合使用时,编号功能在批量重命名文件时为您提供了高度的灵活性。在设置您的重命名规则时,您可以插入通配符字符串 **%n[Number]** 来定义递增操作。

例如,假设您有一个HTPC(家庭影院PC)设置或媒体中心应用程序(如XBOX媒体中心),可以利用抓取和网络服务技术来聚合有关媒体的信息,例如系列、剧集和演员摘要。这些系统大多数都要求严格的命名标准,以便正确区分文件。通常是类似“季号,剧集号,系列 - 标题”(例如,S02E01 Tales From The Crypt - Dead Right)。

如果您现在的文件名为类似这样的:01 Dead Right.mpg,那么您需要将文件01 Dead Right.mpg重命名为S02E01 Tales From The Crypt - Dead Right.mpg,并且文件夹中所有其他文件都需要重命名,剧集号递增(S02E02、S02E03、S02E03等等)。要做到这一点,您选择“替换”选项并替换

[\d]+ -

S02E%n[1] Tales From The Crypt -

这将把上面的文件重命名为S02E01 Tales From The Crypt - Dead Right.mpg。下一个文件将被命名为S02E02 Tales From The Crypt - The Switch.mpg,等等。

只要能匹配上模式,你就可以在文件名的任何位置进行递增。如果没有可匹配的模式,那么你可以使用“上移”和“下移”按钮,按照用户指定的顺序重新排列文件,并使用“前缀”规则添加前缀。有了前缀,你就有了可以匹配的模式来递增数字。这对于音乐文件特别有用,因为CD中的曲目没有在文件名中包含曲目号。

实际应用

我将按媒体类型演示一些我使用过该工具的场景,以便您更好地理解这类事情为何有帮助。

视频/电视录制

众所周知,家庭用户的磁盘空间有限,将所有Tivo录像或电视DVD季撕录存储在服务器硬盘上是不现实的。在某个时候,必须做出决定:要么从服务器删除内容,要么只选择最好的剧集。当这个时候到来时,我就会违反我自己的规则,因为如果一个季度不完整,我不喜欢在它的季度文件夹中留下一个或两个剧集。我宁愿重命名文件并将它们移动到根文件夹。所以,例如,假设服务器上有《地窖传说》第二季,我们已经看完了所有剧集。是时候挑选出我们想保留的并删除我们不想保留的了。

G:\Files\Entertainment\Video\TV Recordings\Tales From The Crypt\Season 02\S02E01 - 
                            Dead Right.avi
G:\Files\Entertainment\Video\TV Recordings\Tales From The Crypt\Season 02\S02E02 - 
                            The Switch.avi
G:\Files\Entertainment\Video\TV Recordings\Tales From The Crypt\Season 02\S02E03 - 
                            Cutting Cards.avi
G:\Files\Entertainment\Video\TV Recordings\Tales From The Crypt\Season 02\S02E04 - 
                            Til Death.avi
....

在这种情况下,我们想删除季节标识符标签并将名称更改为更友好的形式,例如节目的名称和标题。当然,如果您正在使用媒体中心应用程序,您就不会想删除此标签,因为与其相关的数据是依赖项。为了演示,使用多文件重命名工具,我们:

  1. 浏览到包含要重命名文件的文件夹
  2. 在要保留和重命名的剧集旁边打勾(例如,第2季,第1-4集)
  3. 点击“规则”选项卡并勾选“替换”复选框
  4. 在第一个组合框中输入值 [SE][0-9].+ -
  5. 在第二个组合框中输入值 Tales From The Crypt -
  6. 点击“预览”按钮并验证预览的文件名
  7. 点击“重命名”按钮应用更改
  8. 右键单击任何已勾选的项目,然后从上下文菜单中选择“移动文件”选项以移动已重命名的文件。
  9. 将重命名后的文件移动到新位置后,使用资源管理器删除目录。

音乐文件

多年来,音乐文件一直是我生命中的祸根。多年来,我通过购买CD积累了20年的海量音乐库。随着ID3Tag和利用它们的优秀多媒体应用程序(XBMCAmarokMP3-CMS)的出现,文件名的重要性不如以前在WinAmp的黄金时代那么高,那时候你浏览到一个文件夹并将所有内容加载到播放器中。如果音乐文件不遵循严格的约定,那么曲目就不会正确排列,你必须切换各种排序选项才能让同一专辑中的歌曲以正确的顺序显示。

这种对文件正确排列的需求迫使我们许多人使用诸如_年份_曲目编号_艺术家_专辑_歌曲名称_之类的命名方案。当数千个文件开始挤满单个文件夹时,我们将这种方案改为创建目录方案,如_年份\艺术家\专辑\曲目编号_歌曲名称.mp3_。这种方案有许多变体,我几乎尝试了所有这些变体。每次我决定当前结构不是最佳时,我就被迫重命名80GB以上的音乐文件:(。多年来,我终于确定了一个个人标准,目录结构如_流派\艺术家\(年份) 专辑\曲目编号 艺术家 - 歌曲名称.mp3_。

G:\Music\Rock\Megadeth\(1986) Peace Sells - Remaster\01 Megadeth - Wake Up Dead.mp3
G:\Music\Rock\Megadeth\(1986) Peace Sells - Remaster\02 Megadeth - The Conjuring.mp3
G:\Music\Rock\Megadeth\(1986) Peace Sells - Remaster\03 Megadeth - Peace Sells.mp3
G:\Music\Rock\Megadeth\(1986) Peace Sells - Remaster\04 Megadeth - Devils Island.mp3
...

曾几何时,这些文件看起来像

G:\Music\Rock\Megadeth\02 Peace Sells ...But Who's Buying\01_megadeth_wake_up_dead.mp3
...

要将这些名称转换为我们的新约定,我们遵循以下步骤:

  1. 将字符串 **_megadeth_** 替换为 **Megadeth -**
  2. 将所有下划线 (_) 替换为空字符串
  3. 将文件名转换为Proper(标题)大小写

数码照片

与音乐文件一样,数码照片从我1999年拥有第一台数码相机的那天起就一直困扰着我。它们应该如何组织和分类?什么样的目录结构才能规范文件,使它们易于查找但又不过度分散在层次结构中。目前,我确定了这样的基本结构:

G:\Files\Digital Photos\Events
G:\Files\Digital Photos\Family
G:\Files\Digital Photos\Friends
G:\Files\Digital Photos\Holidays
G:\Files\Digital Photos\House
G:\Files\Digital Photos\Projects
G:\Files\Digital Photos\Vacations
G:\Files\Digital Photos\Vehicles
G:\Files\Digital Photos\Wallpaper

所有这些目录也都有自己的子层次结构,这些子层次结构以我所认为的最合乎逻辑的方式组织。

现代操作系统包含数码相机和扫描仪向导实用程序,您导入照片文件时会对其进行命名,在导入之前您应该仔细考虑这个名称。如果您急于查看照片而不愿费心使用逻辑命名系统,那么您最终会得到这样的文件名:

G:\Files\Digital Photos\Vacations\DEFCON 16-2008 - Vegas\DSCF5501.JPG
G:\Files\Digital Photos\Vacations\DEFCON 16-2008 - Vegas\DSCF5502.JPG
G:\Files\Digital Photos\Vacations\DEFCON 16-2008 - Vegas\DSCF5503.JPG
...

这些照片是 DEFCON 2008 的网络运营中心。为了将这些文件转换为逻辑命名方案,我们将字符串 DSCF55 替换为 NOC-,得到以下文件名:

G:\Files\Digital Photos\Vacations\DEFCON 16-2008 - Vegas\NOC-01.jpg
G:\Files\Digital Photos\Vacations\DEFCON 16-2008 - Vegas\NOC-02.jpg
G:\Files\Digital Photos\Vacations\DEFCON 16-2008 - Vegas\NOC-03.jpg
...

数字电子书

电子书是另一个对我来说变化很大的类别。对于根文件夹结构,我决定采用:

G:\Files\EBooks\Comics
G:\Files\EBooks\Computer
G:\Files\EBooks\Science
G:\Files\EBooks\Fiction & Non
G:\Files\EBooks\Tips & Tutorials

曾几何时,我希望我所有的电子书都以年份作为前缀,这样如果我正在寻找某个特定主题,例如C#编程,我会首先看到最新的文本。

G:\Files\EBooks\Computer\Programming\Visual Studio .NET\CSharp.NET\(2002) 
            Database Programing With CSharp.pdf
G:\Files\EBooks\Computer\Programming\Visual Studio .NET\CSharp.NET\(2004) 
            CSharp Threading Handbook.chm
G:\Files\EBooks\Computer\Programming\Visual Studio .NET\CSharp.NET\(2004) 
            Dissecting a CSharp application.pdf
G:\Files\EBooks\Computer\Programming\Visual Studio .NET\CSharp.NET\(2006) 
            Expert CSharp 2005 Business Objects, 2nd Edition.pdf
...

然而,现在,我觉得用出版商名称作为标题前缀更时尚。这项任务很困难,因为我必须首先将文件组织到代表每个出版商的文件夹中。完成后,我用出版商名称(例如,OReilly)替换了年份前缀 **_(\d+)_**。

G:\Files\EBooks\Computer\Hacking\OReilly Amazon Hacks (2003).chm
G:\Files\EBooks\Computer\Hacking\OReilly BlackBerry Hacks (2005).chm
G:\Files\EBooks\Computer\Hacking\OReilly BSD Hacks - 100 Industrial-Strength 
                        Tips & Tools (2004).pdf
G:\Files\EBooks\Computer\Hacking\OReilly Car PC Hacks (2005).chm
...

漫画书

漫画存档的一个常见问题与您在下面看到的类似:

G:\Files\EBooks\Comics\Retail\Image Comics\The Walking Dead\The Walking Dead #1.cbr
G:\Files\EBooks\Comics\Retail\Image Comics\The Walking Dead\The Walking Dead #10.cbr
G:\Files\EBooks\Comics\Retail\Image Comics\The Walking Dead\The Walking Dead #11.cbr
...

显然,第10期不应该跟在第1期后面。为了解决这个问题,我们:

  1. 检查缺少前导零的问题(第1-9期)
  2. 创建一个规则,将字符串 Dead # 替换为 Dead #0
  3. 预览并应用更改

《行尸走肉 #1.cbr》变为《行尸走肉 #01.cbr》。

此外,当我从扫描件创建cbr/cbz文件时,我会等到当天扫描完成后再将它们从zip/rar重命名为cbz/cbr,并且我使用重命名工具批量修改名称。

模拟器ROM

我见过各种各样的模拟器ROM命名约定,但常见的一种是全部大写:

Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\10_YARD_FIGHT.NES
Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\1942.NES
Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\8_EYES.NES
Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\ADDAMS_FAMILY.NES
Y:\Entertainment\Games\Emulators\Nintendo Entertainment 
            System\Roms\OLD\ADVENTURES_IN_THE_MAGIC_KINGDON.NES
Y:\Entertainment\Games\Emulators\Nintendo Entertainment 
            System\Roms\OLD\ADVENTURES_OF_BAYOU_BILLY.NES
...

对于这种命名方案,我执行以下步骤:

  1. 将 **_** 替换为 **[空格]**
  2. 转换为小写(不能从大写转换为ProperCase格式)
  3. 转换为ProperCase

结果如下:

Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\10 Yard Fight.nes
Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\1942.nes
Y:\Entertainment\Games\Emulators\Nintendo Entertainment System\Roms\OLD\8 Eyes.nes
...

我还经常看到这样的:

Y:\Entertainment\Games\Emulators\Nintendo 64\Roms\Banjo-Kazooie (U)[!].v64
Y:\Entertainment\Games\Emulators\Nintendo 64\Roms\Blast Corps (U)[!].v64
Y:\Entertainment\Games\Emulators\Nintendo 64\Roms\Body Harvest (U)[!].v64
...

我真的不确定这些文件名中为什么会有 [!] 字符串。所有这些模拟器 ROM 都来自我多年前拥有的 MAME 街机柜,我一直想知道卖家为什么要使用这种看似毫无意义的文件名。要摆脱这些不合逻辑的感叹号,我们只需将 **[\[!\]]** 替换为 **[空字符串]**。

结论

我不羞愧,我直言不讳;我对这段代码感到尴尬!我写过更优雅的C脚本。然而,我不会道歉,因为我在大约3.5小时内完成了它,因为我发现我服务器上的一些DVD翻录违反了我的严格规则,我无法忍受让它们留在那里嘲笑我,或者一个接一个地重命名每个文件的恐怖!

历史

  • 2008年9月19日:文章提交。
  • 2008年9月20日:通过使用 BackgroundWorker 修复了线程问题。
  • 2008年9月20日:添加了XML持久化。
  • 2008年9月20日:添加了资源管理器树视图。
  • 2008年9月21日:添加了数字递增功能。
© . All rights reserved.