2012-08-13 72 views
1

當我使用帶ls命令的通配符時,它可以工作。在Linux中使用bash查找文件夾中的所有音頻文件

$ 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}' 

什麼是該行的錯誤?

+1

Brace擴展和路徑名擴展不會爲引用的單詞完成,所以您必須運行'ls *。{mp3,ogg}'來獲取該輸出,而不是'ls'*。{mp3,ogg}'' – geirha 2012-08-13 05:29:45

+0

那麼m4a文件等?你應該依靠'file'來代替。 – Blauhirn 2017-11-27 15:20:41

回答

5

我想這應該爲你

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

-o相當於布爾or

1

find不支持完整的shell通配符語法(具體而言,不是大括號)。你需要使用這樣的事情:

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

如果啓用extglob(shopt -s extglob)工作,你可以使用*[email protected](ogg|mp3)

shopt -s extglob 
printf '%s\n' *[email protected](mp3|ogg) 

如果需要遞歸也使globstar(需要的bash 4.0或更新版本)

shopt -s extglob globstar 
printf '%s\n' **/*[email protected](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 /通配符。

find ~ -iname '*.{mp3,ogg}'不起作用,因爲find不做大括號擴展,這是一個bash功能。

2

這是我剛纔做的一個。 。 。

爲.OGG和MP3播放

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

這人會爲你提供甚至那些做有MP3或音頻擴展名的文件。

find . -print0 | xargs -0 file | grep -i audio| cut -f 1 -d ':' 

它解釋到:

find . -print0 查找(列表)的每個文件和輸出作爲與空終止

xargs -0 file運行file(命令)與標準輸入(或管道輸入),分隔作爲第一個參數的空字符。

grep -i audio獲取其中包含字audio(不區分大小寫)

cut -f 1 -d ':'削減: delemited輸入線和打印的第一部分。

相關問題