當我使用帶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}'
什麼是該行的錯誤?
當我使用帶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}'
什麼是該行的錯誤?
我想這應該爲你
find ~ -name "*.mp3" -o -name "*.ogg"
-o相當於布爾or
find
不支持完整的shell通配符語法(具體而言,不是大括號)。你需要使用這樣的事情:
find ~ -iname '*.mp3' -o -iname '*.ogg'
如果啓用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功能。
這是我剛纔做的一個。 。 。
爲.OGG和MP3播放
find Music | grep '/*.ogg\|/*.mp3' | sort -u
這人會爲你提供甚至那些做不有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輸入線和打印的第一部分。
Brace擴展和路徑名擴展不會爲引用的單詞完成,所以您必須運行'ls *。{mp3,ogg}'來獲取該輸出,而不是'ls'*。{mp3,ogg}'' – geirha 2012-08-13 05:29:45
那麼m4a文件等?你應該依靠'file'來代替。 – Blauhirn 2017-11-27 15:20:41