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
这很接近,但不完全是我想要的。有两个空文件夹,没有文件名。
对于使用 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)