![](/img/trans.png)
[英]sed / awk: Delete all lines matching a word not followed by another word
[英]awk/sed join all lines and pass it to another program
我有一個腳本,可從目錄中為我隨機抽取N個文件,我需要將輸出作為amarok或vlc的參數傳遞。
我的腳本pick.sh是:
#!/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
因此,要在我的音樂目錄中隨機選擇3個文件,我要做:
pick.sh /music/ 3
腳本返回3首歌曲,每首歌曲都用雙引號括起來(因為它們可能包含空格),它們全部一行:
“ / 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 (節奏與黑幫);傑作/史努比·道格-No Thang On Me.mp3“
但我想直接將pick.sh的結果傳遞給vlc:
vlc "$(pick.sh /music/ 3)" &
但會添加每個令牌,並用空格分隔。
但是,如果我復制pick.sh的輸出,然后在調用vlc之后將其粘貼,則一切正常。
我怎樣才能使VLC(或amarok或任何程序)正確解析pick.sh的輸出?
謝謝您的幫助!
最好不要手動引用文件名,因為名稱也可以包含引號,因此您應該正確地對它們進行轉義。
可以一個一個地寫文件名,每個文件名放在自己的行上,然后使用xargs程序為vlc提供參數:
find "$1" -name '*.mp3' -print | shuf -n "$2" | xargs vlc
誠然,如果您的音樂收藏中包含名稱中帶有'\\ n'(換行符)的文件(很好,雖然不太可能,但它可能是 :)),那么您必須應對這種情況,並使用'\\ 0'作為記錄分隔符在每個處理階段:
find "$1" -name '*.mp3' -print0 | shuf -z -n "$2" | xargs -0 vlc
但是通常這太過分了。
還應該提到的是,在類似unix的shell中,與Microsoft Windows方法不同,程序不解析其命令行參數,因為命令行參數以單獨的形式傳遞給程序。 所有由空格進行的拆分,處理引用等均由調用方(通常是外殼程序)執行。 這解釋了為什么當您簡單地將給定的行復制到shell並“手動”運行時,vlc才能正確運行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.