繁体   English   中英

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

[英]find all audio files in a folder using bash in linux

当我在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 命令不起作用

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

线路中的错误是什么?

我认为这应该适合你

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

-o 相当于布尔值or

如果启用 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会将其视为文字文件名; 它不知道全局/通配符。

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

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

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

这解释为:

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

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

file -F '//'划界文件名和它的类型由//因为它既不出现在文件名UNIX也不作为文件类型。

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

这是我刚做的。 . .

对于 .ogg 和 .mp3

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

find不支持完整的 shell 通配符语法(特别是不支持花括号)。 你需要使用这样的东西:

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

关于什么?

file * | grep audio

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM