2016-05-17 5 views
0

私はディレクトリからN個のランダムファイルを選ぶスクリプトを持っており、amarokまたはvlcの引数として出力を渡す必要があります。awk/sedはすべての行を結合して別のプログラムに渡します

マイスクリプトpick.shがある:だから、ランダムに私は私の音楽のディレクトリ上の3つのファイルを選択し

#!/usr/bin/env bash 
find "$1" -name *mp3 | shuf -n "$2" | sed -r 's/(.*)/"&"/' | awk 'NR%10{printf $0" ";next;}1'#it should be $2 instead of 10 

pick.sh /music/ 3 

を、スクリプトが二重引用符で囲まれた3曲を返します(理由これらはすべて1行で):

"/ music/s/Los Straitjackets /!Viva!/ Los Straitjackets - Outta Gear.mp3" "/ music/p/Plastilina Mosh/Juan Manuel/Plastilina Mosh - Graceland.mp3" "/ music/s/Snoop Dogg/R & G(リズム&ギャングスタ);マスターピース/スヌープ・ドッグ - Me.mp3" にはタン

しかし、私は直接のvlcにpick.shの結果を渡したい:

vlc "$(pick.sh /music/ 3)" & 

をしかし、それは、スペースで区切って各トークンが追加されます私はpick.shの出力をコピーしてVLCを呼び出した後に貼り付けた場合。

しかし、すべてがOKになります。

を私が正しくpick.sh年代を解析するVLC(Amarokにまたは任意のプログラムまたは)を行うことができますどのように出力?

ありがとうございました!

答えて

1

名前には引用符も含めることができるので、手動でファイル名を引用しないほうがよいので、適切にエスケープする必要があります。

一つは、独自のライン上の各ファイル名で、ファイル名を一つずつ書いて、その後、引数を指定してVLCを養うためにxargsプログラムを使用することがあります。

find "$1" -name '*.mp3' -print | shuf -n "$2" | xargs vlc 

確かに、あなたの音楽コレクションは「\ nのファイルが含まれている場合'(改行)をその名前に入れてください(そうではないかもしれませんが、 :))、その場合に対処し、処理の各段階でレコードセパレータとして' \ 0 'を使用する必要があります。

find "$1" -name '*.mp3' -print0 | shuf -z -n "$2" | xargs -0 vlc 

通常はそれは卵ですrkill。

また、UNIXのようなシェルでは、Microsoft Windowsのアプローチとは異なり、プログラムはコマンドライン引数を解析されません。なぜなら、後者は分離された形式でプログラムに渡されるからです。空白による分割、引用の処理などは、呼び出し側(通常はシェル)によって実行されます。これは、単に特定の行をシェルにコピーして "手動で"実行すると、vlcが正しく動作する理由を説明しています。

+1

間違いなく!オリジナルをコピーし、徹底的に修正していない。 – user3159253

+0

上手く動作したThanx! – Balpo

関連する問題