2011-07-05 148 views
3

回頁頂我寫了一個shell腳本,它可以在指定目錄中找到的任何C++文件自動運行python腳本。我測試了它,它運行良好,我保存並忘記了它;問題是我回來使用它,並遇到一個問題(原來我沒有足夠的測試,呃?)。在shell腳本中使用「find」時出現的問題

無論如何,我之前測試的源目錄路徑在其名稱中沒有空格,例如

/somedirectory/subfolder/src/ 

但是,當我嘗試使用帶有空格的路徑運行腳本時,例如,

/Documents\ and\ Settings/subfolder/src/ 

它不工作。

我找到問題所在,但我不知道如何解決它。下面是導致該問題的代碼:

names=($(find "${SOURCE_ROOT_DIRECTORY}" -regex "[A-Za-z0-9]*.*\(cpp\|h\|cc\)$")) 

正則表達式的工作原理與無空格的路徑,所以我不知道是否有正則表達式的問題,或者如果「查找」命令停止,當它遇到空間。

任何人都可以幫忙嗎?

回答

2

find沒有 「停止」,當它擊中在其名稱中有空格的文件。嘗試將它們作爲元素存儲在數組中時發生此問題。

更改IFS的換行符(默認爲空格):

#change IFS 
OLDIFS=$IFS 
IFS=$'\n' 

#run find 
names=($(find . -regex "[A-Za-z0-9]*.*\(cpp\|h\|cc\)$")) 

#restore IFS 
IFS=$OLDIFS 

#test out the array 
echo "size: ${#names[@]}" 
for i in "${names[@]}" 
do 
    echo "$i" 
done 
+0

這是針對m e,所以這是我接受的答案:) – BigStuuu

1

您可以使用閱讀

while read -r file; do 
    names+=("$file") 
done < <(find "${SOURCE_ROOT_DIRECTORY}" -regex "[A-Za-z0-9]*.*\(cpp\|h\|cc\)$") 

小試

$ mkdir -p /tmp/test && cd $_ 
$ touch foo bar "ab cd" 
$ ls 
ab cd bar foo 
$ while read -r file; do names+=("$file"); done < <(find /tmp/test -type f); 
$ echo ${#names[@]} 
3 
$ for file in "${names[@]}"; do echo "$file"; done; 
/tmp/test/ab cd 
/tmp/test/bar 
/tmp/test/foo 
$ unset names file 
+0

對於在路徑中沒有換行符的名稱可能工作正常... –

2

的規範使用模式是:

find subfolder/ -type f -name '*.cpp' -print0 | 
    xargs -0rn1 myscript.py 

這有所有的鐘聲和口哨聲,你也許可以做到沒有-type f,也許有些xargs標記