在 Linux 或 Windows 上,如何找到该目录中唯一 mp3 的所有 mp3 的路径?

Ral*_*hyZ 4 windows linux mp3 script find

我有一个 Music 文件夹,内容如下:

音乐
    -艺术家A
        -歌曲1.mp3
        -专辑A
            -歌曲2.mp3
            -歌曲2.m4a
        -专辑B
            -歌曲1.mp3
            -歌曲2.mp3
            -歌曲3.mp3
        -专辑C
            -歌曲1.mp3
            -歌曲1.jpg
            -SomeFolder1
                -歌曲1.mp3
    -艺术家B
        -歌曲1.mp3
    -艺术家C
        -歌曲1.mp3
        -歌曲2.mp3
        -歌曲3.mp3
        -SomeFolder2
            -歌曲1.jpg
            -Song2.jpg
        -SomeFolder3


我正在寻找这样的输出:

艺术家A/歌曲1.mp3
艺术家A/AlbumA/Song2.mp3
艺术家A/专辑C/Song1.mp3
艺术家A/AlbumC/SomeFolder1/Song1.mp3
艺术家B/歌曲1.mp3



所以,我不想要只有一个文件的目录,我想要只有一个 mp3 的目录 - 无论子目录或其他文件如何。我也不想要空目录或包含多个 mp3 的目录。

我并不反对 Linux 上的 shell 脚本。但是,我不想在任何一个操作系统上编译程序。

我已经尝试过: find . -type d -exec sh -c 'set -- "$0"/*.mp3; [ $# -le 1 ]' {} \; -print

但这给了我这个输出:

。
./艺术家B
./艺术家A
./艺术家A/专辑A
./艺术家A/专辑C
./ArtistA/AlbumC/SomeFolder1
./ArtistC/SomeFolder2
./ArtistC/SomeFolder3

这很接近,但不完全是我想要的。有两个空文件夹,没有文件名。

nvu*_*ono 5

对于使用 PowerShell 的 Windows,假设您已位于文件夹 C:\YOUR_PATH 中:

PS C:\YOUR_PATH> (Get-ChildItem -recurse | Where-Object {$_.name -match ".mp3"}) | Group-Object -Property Directory | Where-Object {$_.Count -eq 1} | ForEach-Object { (Get-ChildItem $_.Name -Filter "*.mp3").FullName}
Run Code Online (Sandbox Code Playgroud)

输出:

C:\YOUR_PATH\ArtistA\Song1.mp3
C:\YOUR_PATH\ArtistA\AlbumA\Song2.mp3
C:\YOUR_PATH\ArtistA\AlbumC\Song1.mp3
C:\YOUR_PATH\ArtistA\AlbumC\SomeFolder1/Song1.mp3
C:\YOUR_PATH\ArtistB\Song1.mp3
Run Code Online (Sandbox Code Playgroud)

分解管道命令:

获取当前目录下的所有文件和文件夹

Get-ChildItem -recurse 
Run Code Online (Sandbox Code Playgroud)

仅匹配基于您的掩码的文件

Where-Object {$_.name -match ".mp3"})
Run Code Online (Sandbox Code Playgroud)

根据目录属性执行分组

Group-Object -Property Directory 
Run Code Online (Sandbox Code Playgroud)

仅选择包含 1 项的目录

Where-Object {$_.Count -eq 1} 
Run Code Online (Sandbox Code Playgroud)

提取每个目录中与您的文件掩码匹配的一个文件的全名

ForEach-Object { (Get-ChildItem $_.Name -Filter "*.mp3").FullName} 
Run Code Online (Sandbox Code Playgroud)