2017-10-10 28 views
1
import Turtle 
import Prelude hiding (FilePath) 
import Data.Text hiding (find) 
main = do 
    f <- view $ format fp <$> find (suffix ".mp4") "/Users/me/videos" 
    procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab","160k","-ar","48000","-i"] empty 

基本上我想喂所有的視頻文件名ffmpeg。 兩個問題:哈斯克爾海龜腳本:如何消費殼牌

  1. 如何將procsShell流合併?
  2. ffmpeg需要兩個輸入:一個用於-i,另一個用於輸出文件名。 Turtle實施這個最好的做法是什麼?

我見過foldIO函數看起來很有前途。但我無法弄清楚如何使用它。

回答

2

不要使用那樣的view。你使用它來運行 a Shell,它打印結果值,使他們無法訪問你。 Shell本身就是一個monad,所以你應該建立一個Shell動作,然後用viewsh運行(放棄不打印的值)。 (它們是終端功能,只有當你完成你所做的事情時才使用它們)。實際上,MonadIO Shell,所以你可以在IO中做任何事情,你可以在Shell(通過liftIO :: MonadIO m => IO a -> m a)做。

main = sh $ do -- You don't want to print the output of this Shell (a bunch of()s) 
    filename <- format fp <$> find (suffix ".mp4") "/Users/me/videos" 
    let output = findOtherName filename -- Find the output arg for ffmpeg 
    procs "ffmpeg" ["-vn","-acodec","libmp3lame","-ac","2","-ab" 
       ,"160k","-ar","48000","-i",filename,output ] -- Just add them on 

這可比

#!/bin/sh 
for filename in /Users/me/videos/*.mp4; do 
    output="`findOtherName "$filename"`" 
    ffmpeg -vn -acodec libmp3lame -ac 2 -ab 160k -ar 48000 -i "$filename" "$output" 
done 
+0

極大的幫助。我其實已經搞清楚了。你能否給我一個關於如何生成輸出文件名的提示?我想從mp4更改爲mp3。我無法弄清楚如何使用sed命令來進行替換。 – osager

+1

我不會使用'sed'。只需使用「文本」庫的功能即可。 'init filename'>「3」'應該這樣做('init'除了最後一個字符(除最後一個「4」之外的所有字符),'<>「3」'在末尾添加一個「3」 )。 – HTNW

+0

聰明!如果'procs'引發異常呢?如何管理該異常並拋出一些消息並將該過程繼續到其他文件? @HTNW – osager