重命名子文件夹:从父文件夹添加前导词
Rename subfolder: add leading word from parent folder
我在 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
现在我想通过添加 Artist
名称作为前缀来重命名所有 Album
文件夹,并将所有 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。
谢谢!
实际上,这可以通过多种方式完成。我将在 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
命令更改为 cp -R
一个。
所有关于脚本的内容都在一个文件中。如果您想直接从命令行执行它,更改音乐库的文件夹名称会有些棘手,它看起来像这样:
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
以及对所有内容的解释:
mkdir
创建目录。
for A in B ; do C ; done
是一个循环。它循环遍历 B
中由 IFS 字符之一分隔的每个字符串,并在执行 C
时将其分配为变量 A
的值。
- 请注意脚本中的文本带有星号。 shell 将带有星号的字符串扩展到它找到的与模式匹配的内容。例如,如果您有一堆 Word 文档,键入
echo *.docx
将扩展到当前文件夹中匹配该结尾的每个名称(在另一种情况下,echo /path/*.docx
)。
- 因此,对于指定目录内的每个文件夹,分配(每个艺术家文件夹一次)变量
artistname
并将指定文件(在本例中为文件夹)的基本名称作为其值。所以,basename /path/to/anything
returns anything
.
- 在另一个
for
循环的帮助下,对艺术家目录中的每个元素进行重命名,如果新名称在另一个目录中,它将移动到那里。
- 同样,
2>/dev/null
重定向用于将 stderr
中的所有输出重定向到空白。 stdout
中的输出仍然会被打印出来,如果有的话。
一些重要说明
- 我不知道 shell 来自 Bash on Ubuntu on Windows 是否检测到
/dev/null
作为标准UNIX机器有或没有的特殊字符文件。 可能它会,否则它不会与这么多东西兼容。
- 如果您在 Windows 上 Ubuntu 上有 Bash,则此 仅 Windows 10.如果我没记错的话,使用它的机会是在周年纪念更新中实现的。如果您有更新,但没有
bash
,我建议您安装它。互联网上有几个指南。
- 关于文件夹结构。我怀疑
/dev/null
与 POSIX 文件夹结构相同:它遵循它,因为它不仅仅是 WindowsBash Windows,但 Bash 在 Ubuntu 在 Windows.
我自己找到了答案。最好的方法是使用 mp3tag 工具。您可以创建新文件夹并将文件复制到其中。
Select 转换器 > 标记 - 文件名
输入:
E:\%artist% - %album%$num(%track%,2) - %title%
您将收到一个包含艺术家的目录 - Albumname - File.mp3
我在 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
现在我想通过添加 Artist
名称作为前缀来重命名所有 Album
文件夹,并将所有 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。 谢谢!
实际上,这可以通过多种方式完成。我将在 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
命令更改为 cp -R
一个。
所有关于脚本的内容都在一个文件中。如果您想直接从命令行执行它,更改音乐库的文件夹名称会有些棘手,它看起来像这样:
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
以及对所有内容的解释:
mkdir
创建目录。for A in B ; do C ; done
是一个循环。它循环遍历B
中由 IFS 字符之一分隔的每个字符串,并在执行C
时将其分配为变量A
的值。- 请注意脚本中的文本带有星号。 shell 将带有星号的字符串扩展到它找到的与模式匹配的内容。例如,如果您有一堆 Word 文档,键入
echo *.docx
将扩展到当前文件夹中匹配该结尾的每个名称(在另一种情况下,echo /path/*.docx
)。
- 请注意脚本中的文本带有星号。 shell 将带有星号的字符串扩展到它找到的与模式匹配的内容。例如,如果您有一堆 Word 文档,键入
- 因此,对于指定目录内的每个文件夹,分配(每个艺术家文件夹一次)变量
artistname
并将指定文件(在本例中为文件夹)的基本名称作为其值。所以,basename /path/to/anything
returnsanything
. - 在另一个
for
循环的帮助下,对艺术家目录中的每个元素进行重命名,如果新名称在另一个目录中,它将移动到那里。- 同样,
2>/dev/null
重定向用于将stderr
中的所有输出重定向到空白。stdout
中的输出仍然会被打印出来,如果有的话。
- 同样,
一些重要说明
- 我不知道 shell 来自 Bash on Ubuntu on Windows 是否检测到
/dev/null
作为标准UNIX机器有或没有的特殊字符文件。 可能它会,否则它不会与这么多东西兼容。 - 如果您在 Windows 上 Ubuntu 上有 Bash,则此 仅 Windows 10.如果我没记错的话,使用它的机会是在周年纪念更新中实现的。如果您有更新,但没有
bash
,我建议您安装它。互联网上有几个指南。 - 关于文件夹结构。我怀疑
/dev/null
与 POSIX 文件夹结构相同:它遵循它,因为它不仅仅是 WindowsBash Windows,但 Bash 在 Ubuntu 在 Windows.
我自己找到了答案。最好的方法是使用 mp3tag 工具。您可以创建新文件夹并将文件复制到其中。
Select 转换器 > 标记 - 文件名
输入:
E:\%artist% - %album%$num(%track%,2) - %title%
您将收到一个包含艺术家的目录 - Albumname - File.mp3