2012-01-27 270 views
1

我從一個目錄中抓取所有文件名,並且想創建這些文件名的以逗號分隔的字符串,以便我可以將該字符串作爲參數傳遞給一個應用程序。這是我的代碼片段:將for循環的輸出解析爲逗號分隔字符串的變量

if [[ -n $(ls | grep lpt) ]]; then 
    for files in $(find . -maxdepth 1 -type f); do 
    #parse output into variable fileList 
    done 
fi 

我該如何做到這一點?

+0

你應該使用數組來代替。 – jordanm 2012-01-27 19:23:21

+0

這個應用程序,我需要通過這個接受文件名的逗號分隔的字符串像'$程序文件'file1,file2,file3'' – Mechaflash 2012-01-27 19:27:32

+0

這是什麼應用程序?一個「,」是一個可接受的字符在文件名中。如果文件在一個數組中,你可以用類似'program -file $(printf'%s,'「$ {array [@]}」)' – jordanm 2012-01-27 20:14:32

回答

4

想象的要容易。

find . -maxdepth 1 -type f -printf '%P,' | sed -e 's/,$/\n/' 

sed表達式用換行符替換終端,

+0

超級簡單。謝謝 – Mechaflash 2012-01-27 15:59:34

+0

調用了'%P',並且是否存在所有這些類型'變量'的參考列表? – Mechaflash 2012-01-27 19:29:55

+0

這是「man find」中記錄的「指令」。 – thiton 2012-01-27 19:40:42

0

而不是你的循環,你可以使用find-exec選項,用shell擴展一起:

fileList=$(find . -maxdepth 1 -type f -exec echo -n "{}," \; | sed 's/,$//') 

sed位只是刪除尾隨逗號。 sed用於編輯輸入流,即在這裏,它從find獲取管道文本,並且正在編輯它正在獲取的內容。由於給出的命令在最後留下了額外的,,因此sed使用其替代命令(s)將其除去。形式爲:

s/EXPRESSION/REPLACEMENT/ 

所以,$意思是「在該行的末尾逗號,因爲$裝置‘在線’的端部,以及第二和第三斜線之間的虛無意味着它被替換。沒什麼

至於在find\;,這只是使用-exec的要求,所以它知道當它完成讀取命令,它在手冊頁:)

+0

你可以翻譯'sed's /,$ //'我知道你說過它刪除了尾隨的逗號,但是這是什麼,因爲缺少一個更好的單詞,說?爲什麼要逃避';'?我不是「質疑」你,我只是好奇,因爲我是shell腳本的新手,我想知道這種行爲。 – Mechaflash 2012-01-27 15:48:49

+0

@Mechaflash更新! – 2012-01-27 15:53:04

+0

我收到的輸出不正確。它顯示'./file1,./file2 ./file3'等。 – Mechaflash 2012-01-27 16:03:32

1

您應該使用在其他的答案顯示的單行,但爲了填補你的腳本,你可以這樣做:

if [[ -n $(ls | grep lpt) ]]; then 
    for file in $(find . -maxdepth 1 -type f); do 
    #parse output into variable fileList 
    fileList="$file,$fileList" 
    done 
fi 

#now remove the trailing comma from the fileList 
fileList=$(sed 's/,$//' <<< "$fileList") 

(注:您的for循環將無法正常工作,如果你的文件名中有空格)

+0

所有非間距文件= D。感謝它適應我所擁有的。 – Mechaflash 2012-01-27 15:59:26

+0

並感謝您向我展示這一點。我之前已經在批處理文件中完成了這個任務,但它很時髦,因爲它需要延遲擴展並將該變量作爲擴展調用。在shell腳本= D中非常簡單 – Mechaflash 2012-01-27 16:05:36