2011-08-18 153 views
1

這裏有一個bash腳本播放所有的音頻,它擊:在當前目錄

  1. 得到的所有文件在當前目錄下,然後
  2. 得到其中的所有音頻文件(允許文件名有空格)
  3. 將列表發送到audacious -p - 應播放列表。

第三步是腳本失敗的地方。下面是該腳本:

#!/bin/bash 

find $1 -name '* *' | while read filename; do 

Type=`file -i "$filename" -F "::" | sed 's/.*:: //' | sed 's/\/.*$//'` 

if [ $Type=audio ]; then 
    List="$List '$filename'" 
fi 
done 

audacious2 -p $List & 

因此問題是:如何轉換

file name 1 
file name 2 
file name 3 

'file name 1' 'file name 2' 'file name 3' 

在bash?

+1

你會想要在* audacious2 -p ...命令中注意*「參數列表太長」*錯誤,這會在你嘗試加載大量文件時發生。使用'audacious2 -E $ filename'將文件附加到當前播放列表中或者從文件列表中創建一個臨時播放列表可能會更好。 –

回答

1
#!/bin/sh 
#find "$1" -name '* *' | # Edited as per OP's request 
find . -type f -name '* *' | 
while read -r filename; do 
    case `file -i "$filename" -F "::"` in 
     *::" audio"/*) echo "$filename" | tr '\012' '\000' ;; 
    esac 
done | 
xargs -0 audacious2 -p & 

這裏的要點是使用xargs爲命令提供一個文件名列表,但是我希望你也能夠理解模式匹配條件如何更加優雅;絕對學會使用case。 (我希望我得到了file正確的輸出。)

編輯更新使用find -type fread -rtr '\012' '\000'xargs -0。通過使用零字節作爲終止符,xargs可以接受文件名中的空格和換行符。

+0

它不起作用(至少對我而言)。第一行實際上應該是'find''pwd'「-type f |'。感謝'case'技巧。 – Adobe

+0

只要找到。'那麼應該工作,除非你有腳本的其他部分需要絕對路徑。哪部分不適合你? – tripleee

+0

最後一行 - xargs one - 不起作用。因爲我的文件有空格。如果我評論'| xargs audacious2 -p&'東西 - 劇本回聲好。但是,當未註釋的xargs得到這一切都是錯誤的。 – Adobe

0

我已經成功與

#!/bin/bash 
# enques all audio files in the dir and its child dirs to audacious. 

# the following finds all audio files in the dir (and its child dirs) 
find "`pwd`" -type f | while read filename; do 
    Type=`file -i "$filename" -F "::" | sed 's/.*:: //' | sed 's/\/.*$//'` 
    if [ $Type=audio ]; then 
     # this enqueues them to audacious 
     audacious2 -e "$filename" & 
    fi 
done 

# and this line presses "play" 
audacious2 -p & 

它正常工作,做到這一點。

編輯

的問題還處於一種「原始」的方式解決(即把所有的歌曲作爲參數傳遞給玩家,這樣的:audacious2 -p "song 1" "song 2")。由於伊格納西奧的鏈接,現在它的工作原理:

#!/bin/bash 
# enques all audio files in the dir and its child dirs to audacious. 

# the following finds all audio files in the dir (and its child dirs) 
find "`pwd`" -type f | { 
while read filename; do 
    Type=`file -i "$filename" -F "::" | sed 's/.*:: //' | sed 's/\/.*$//'` 
    if [ $Type=audio ]; then 
     List="$List \"$filename\"" 
    fi 
done 
echo $List | xargs audacious2 -p & 
} 

@tripleee:

它可以在你的方式來工作,而不xargs的:

#!/bin/bash 
# enques all audio files in the dir and its child dirs to audacious. 

find . | 
while read filename; do 
    case `file -i "$filename" -F "::"` in 
     *::" audio"/*) audacious2 -e "$filename" & ;; # echo "$filename";; 
    esac 
done 
+1

[BASH FAQ條目#24:「我在一個流水線中的循環中設置變量,爲什麼它們在循環終止後消失?或者爲什麼我不能通過管道數據讀取?」](http:// mywiki。 wooledge.org/BashFAQ/024) –