簡體   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