5

当我在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}'

行中的错误是什么?

4

6 回答 6

15

我认为这应该对你有用

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

-o 等价于布尔值or

于 2012-08-13T05:08:43.807 回答
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其视为文字文件名;它不知道全局/通配符。

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

于 2012-08-13T05:27:28.257 回答
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)),并且对于每个匹配项,打印文件路径。

于 2016-10-23T15:06:18.930 回答
2

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

对于 .ogg 和 .mp3

         find Music | grep '/*.ogg\|/*.mp3' | sort -u
于 2014-01-10T02:17:27.850 回答
1

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

find ~ -iname '*.mp3' -o -iname '*.ogg'
于 2012-08-13T05:08:12.697 回答
0

关于什么?

file * | grep audio
于 2018-12-06T20:03:38.237 回答