重命名子文件夹:从父文件夹添加前导词

时间:2017-02-25 16:15:26

标签: shell directory rename subdirectory total-commander

我在Artist个文件夹中组织了一个包含Album个子文件夹的大型音乐库:

Artist 1
- Album A
-- File 1
-- File 2
- Album B
-- File 1
-- File 2
Artist 2
- Album C
-- File 1
-- File 2
- Album D
-- File 1
-- File 2

现在我想通过添加Album名称作为前缀重命名所有Artist个文件夹并将所有Album个文件夹移到 root 目录中,就像这样:

Artist 1 - Album A
- File 1
- File 2
Artist 1 - Album B
- File 1
- File 2
Artist 2 - Album C
- File 1
- File 2
Artist 2 - Album D
- File 1
- File 2

最好的方法是什么?我试图用Total Commander做到这一点,但我不明白。或者shell,mp3tag?我使用的是Windows 10。 谢谢!

3 个答案:

答案 0 :(得分:0)

使用C#可以很容易地完成,但是您需要可以免费下载的Visual Studio: https://info.microsoft.com/FR-VSO-CNTNT-FY16-10Oct-15-VisualStudioCommunity-Register.html

答案 1 :(得分:0)

实际上,这可以通过几种方式完成。我将在bash中展示如何,但仅当你在Windows上的Ubuntu上有 Bash 时才会这样做。再次:

BASH

假设您的音乐库是~/Music/,所有艺术家文件夹都在里面,您接受将所有内容移动到新文件夹,假设它尚未存在(因为如果您有一个名为' CoolSinger'的艺术家文件夹,只是意外你还有一个名为' CoolSinger - CoolAlbum'的另一个艺术家文件夹,由于一个错误,会有问题.. 。),并且没有任何其他文件涉及到您声明的内容,shell脚本将如下所示:

#!/bin/bash

mkdir ~/NewMusic/
for artistdir in ~/Music/*; do
  artistname="$(basename "${artistdir}")"
  for albumdir in "${artistdir}"/*; do
    albumname="$(basename "${albumdir}")"
    mv "${albumdir}" ~/NewMusic/"${artistname} - ${albumname}" 2>/dev/null
  done
done

让我在人类中解释:

创建目标文件夹。然后,对于每个artist(假设所有文件夹都是);迭代遍历每个album子文件夹,将其移动到新文件夹,然后使用实际文件夹名称中的艺术家名称和文件夹名称重命名它。如果一切顺利,这将导致:

  • 包含原始子文件夹名称的文件夹~/Music/,但它们现在已空。
  • 具有所需结构的文件夹~/NewMusic
  • 如果一个艺术家文件夹是空的,那么shell会尝试抛出错误,因为它会扩展为文字字符串(稍后解释),但不要担心,因为如果它是空的,那么任何事情都与它,所以你可以忽略它,将2>/dev/null附加到命令。但是,如果出现任何其他问题,它也会被静音。

如果您愿意,让我们说,保留原始文件,and拥有所有具有所需结构的文件的副本,您应该更改mv命令{ {1}}一个。

所有这些都是针对脚本的,在文件中。如果你想直接从命令行执行它,这对于更改音乐库的文件夹名称会有些棘手,它将如下所示:

cp -R

并解释一切:

  1. mkdir ~/NewMusic/; for artistdir in ~/Music/*; do artistname="$(basename "${artistdir}")"; for albumdir in "${artistdir}"/*; do albumname="$(basename "${albumdir}")"; mv "${albumdir}" ~/NewMusic/"${artistname} - ${albumname}"; done; done 创建目录。
  2. mkdir是一个循环。它遍历由for A in B ; do C ; done中的一个IFS字符分隔的每个字符串,并将其指定为变量B的值,同时执行A
    • 请注意,脚本中的文本带有星号。 shell将带有星号的字符串扩展为它找到的与模式匹配的字符串。例如,如果您有一堆Word文档,则键入C将扩展到与当前文件夹匹配的每个名称(在另一种情况下,echo *.docx)。
  3. 因此,对于指定目录中的每个文件夹,为(每个艺术家文件夹一次)分配变量echo /path/*.docx,并将指定文件的基本名称(在本例中为文件夹)作为其值。因此,artistname会返回basename /path/to/anything
  4. 在另一个anything循环的帮助下,对艺术家目录中的每个元素执行操作,按照指定重命名,如果新名称在另一个目录中,则会将其移动到那里。
    • 同样,for重定向用于将2>/dev/null中的所有输出重定向到void。但是,stderr中的输出仍会打印,如果有的话。
  5. 一些重要说明

    • 我不知道来自Windows上 Bash on Ubuntu 的shell是否将stdout检测为标准UNIX机器具有或不具有的特殊字符文件。 可能它确实存在,或者它不会与很多东西兼容。
    • 如果您在Windows 10中的Windows上的Ubuntu上有 Bash ,那么 。如果我没记错的话,使用它的可能性是通过周年纪念更新实现的。如果您有更新,但没有/dev/null,我建议您安装它。互联网上有几个指南。
    • 关于文件夹结构。我怀疑bash与POSIX文件夹结构相同:它跟随它,因为它不仅仅是 Windows上的Bash ,而是 Bash on Windows上的Ubuntu

答案 2 :(得分:0)

我自己找到了答案。最好的方法是使用mp3tag工具。您可以创建新文件夹并将文件复制到其中。

  1. 选择转换器>标签 - 文件名

  2. 输入:

    E:\%artist% - %album%\$num(%track%,2) - %title%
    
  3. 您将收到一个名为Artist - Albumname \ 01 - File.mp3的目录