2013-03-15 59 views
0

我正在嘗試爲包含空格,逗號和括號的文件夾創建for循環。例如: Italy - Rimini (Feb 09, 2013)bash循環帶有符號的目錄

首先它掃描父文件夾/相冊,看起來像上面的示例中的子文件夾。然後它對子文件夾中的文件執行卷曲操作。如果子文件夾不包含空格,逗號或其他符號,它可以正常工作。

for dir in `ls /albums`; 
do 
    for file in /albums/$dir/* 
    do 
      curl http://upload.com/up.php -F uploadfile[][email protected]"$file" > out.txt 
      php process.php 
    done 
    php match.php 
done 

但如果有這樣的符號,似乎捲曲位卡住 - 它無法找到$文件(可能是因爲$ dir是不正確的)。

我可以替換子目錄中的所有符號或刪除它們或將文件夾重命名爲001,002,並且它可以完美地工作。但在訴諸於此之前,我想知道是否可以使用bash技巧解決這個問題,同時保持子文件夾名稱不變?

+2

閱讀關於'find -print0 | xargs ...'在這裏StackOverflow。 100年的exmamples。祝你好運。 – shellter 2013-03-15 10:50:36

+1

迭代'ls'的輸出並不好,因爲文件名可能包含像\ n這樣的時髦字符。 – mtk 2013-03-15 11:55:33

回答

1

熟悉分詞的概念你的shell。然後意識到使用ls來獲取帶空格的文件列表正在尋求麻煩。相反,利用shell通配,然後報價擴展:

cd /albums 
for dir in *; do 
    for file in /albums/"$dir"/*; do 
    echo x"$dir"x"$file"x 
    done 
    php match.php 
done 
+0

看起來更好。我現在進一步了。謝謝!我發現cURL不支持上傳包含逗號的文件。 https://code.google.com/p/plowshare/issues/detail?id=550 – zataived 2013-03-15 12:10:12

0

對於文件名中使用空格的問題,您必須將IFS變更爲

IFS=' 
' 

它告訴外殼,只有換行是文件分隔符。默認情況下,IFS設置爲製表符,空格和換行符。

所以,只需在循環開始之前放置它,它就可以處理包含空格的文件名。

並且當然會在引用變量名時加上引號。