2014-03-30 188 views
-1

我試圖編寫一個腳本,該腳本在文件列表上工作。如果我想在同一個目錄中的所有文件工作,然後Bash - 轉換逗號分隔列表

FILES=*.ext 

for i in $FILES; do 
    something on "$i" 
done 

工程確定,問題是當我想要的工作只是一個選擇的文件,而不是一切。如何將逗號分隔的文件列表(可能包含或不包含空格)轉換爲相同的格式,以便我可以將其保存在$ FILES中並使用相同的代碼?

非常感謝,提前

大衛·肖

+2

你介意提供一些樣本數據嗎? – Saucier

回答

1

做的是不使用文件名的分隔列表,但使用一個數組(避免大寫變量名)正確的事情,這將避免的問題包含您的分隔符(如,)文件名和是慣用的做法:

files=(*foo*.ext1 *bar*.ext2 file1 "file 2 with a space") 

for file in "${files[@]}"; do 
    [ -e "${file}" ] || continue 
    do_something_with "${file}" 
done 

除非你有過怎樣$files人口無法控制這是你想要的,如果你的腳本被喂以通訊一個單獨的列表,你完全無法避免它,那麼你可以相應地設置IFS,如@ BroSlow的answer

由於globbing在用空格擴展文件名時沒有問題(即使在您的示例中也沒有)。

您可能還想檢查extended globbing (extglob)以便能夠更具體地匹配。

0

如果我正確解釋您的問題,您可以將中的內部字段分隔符(IFS)改爲逗號,然後用文字分割處理其餘部分(例如,

#!/bin/bash 

FILES="file1,file2 with space,file3,file4 with space" 

IFS=',' 
for i in $FILES; do 
    echo "File = [$i]" 
done 

這將輸出

File = [file1] 
File = [file2 with space] 
File = [file3] 
File = [file4 with space] 

注意,如Adrian Frühwirth pointed out in comments,如果文件名可以包含逗號,這將失敗。

+0

是的,但這不是你如何做到的。你只是改變了問題,現在它會用逗號分隔文件名。 –

+0

@AdrianFrühwirth我仍然在解釋這個問題,因爲他有一個用逗號分隔的文件列表,並且想要遍歷它。如果文件名本身可以包含逗號,那麼問題幾乎無法解決。 – BroSlow

+0

我認爲這是一個XY問題,OP只需要知道他們不應該存儲 - 也不是必需的 - 一個逗號分隔的文件/模式列表。如果你使用一個數組並正確地做,你可以避免所有這些問題。 –

相關問題