在 linux 中使用 bash 查找文件夹中的所有音频文件

问题描述 投票:0回答:7

当我在

ls
命令中使用通配符时,它有效。

$ ls '*.{mp3,ogg}'  # Showing only two formats in the command
cannot access *.mp3: No such file or directory
1.ogg 2.ogg 3.ogg

但是使用查找命令不起作用

$ find ~ -iname '*.{mp3,ogg}'

行中有什么错误?

linux bash find ls
7个回答
17
投票

我认为这对你有用

   find ~ -name "*.mp3" -o -name "*.ogg"

-o 相当于布尔值

or


4
投票

如果启用extglob(

shopt -s extglob
),则可以使用
*.@(ogg|mp3)
.

shopt -s extglob
printf '%s\n' *.@(mp3|ogg)

如果你也需要递归,启用 globstar(需要 bash 4.0 或更新版本)

shopt -s extglob globstar
printf '%s\n' **/*.@(mp3|ogg)

当你使用

ls *.{mp3,ogg}
时,你结合了大括号扩展和路径名扩展。发生的事情是:

ls *.{mp3,ogg}  
ls *.mp3 *.ogg  # after brace expansion
ls '*.mp3' 1.ogg 2.ogg 3.ogg # after pathname expansion

如果没有与 glob 匹配的文件,则 glob 将原样传递。

ls
会将其视为文字文件名;它不知道 globs/wildcards.

find ~ -iname '*.{mp3,ogg}'
不起作用,因为
find
不进行大括号扩展,这是 bash 的一个特性。


4
投票

这甚至为您提供那些没有具有mp3或音频扩展名的文件。

find -print0 | xargs -0 file -F '//' | awk -F '//' 'tolower($2) ~ /audio/ { print $1 }'

解释为:

find . -print0 
查找(列出)每个文件并使用空终止符输出

xargs -0 file -F '//'
使用标准输入(或管道输入)运行
file(1)
,由空字符分隔,作为第一个参数。

file -F '//'
//
分隔文件名及其类型,因为它既不出现在 UNIX 文件名中,也不作为文件类型出现。

awk -F '//' '...'
使用
//
定界符作为字段分隔符。 awk 脚本不区分大小写地匹配第二个字段中出现的
audio
(即
file(1)
报告的文件类型),并且对于每个匹配项,打印文件路径。


2
投票

这是我刚刚做的一个。 . .

对于 .ogg 和 .mp3

         find Music | grep '/*.ogg\|/*.mp3' | sort -u

1
投票

find
不支持完整的 shell 通配符语法(具体来说,不是大括号)。你需要使用这样的东西:

find ~ -iname '*.mp3' -o -iname '*.ogg'

0
投票

怎么样?

file * | grep audio

0
投票
find . -exec file {} --mime-type \; | grep "audio\|video"

可能会成功。我的 m4a 文件的 mime 类型是

video/mp4
,所以我也需要 grep 。

© www.soinside.com 2019 - 2024. All rights reserved.