[英]Problem using “find” in shell scripting
我在回來的時候寫了一個 shell 腳本,該腳本自動在它可以在指定目錄中找到的任何 c++ 文件上運行 python 腳本。 我測試了它,它工作得很好,我保存了它並忘記了它; 問題是我回來使用它並遇到了問題(結果我沒有對其進行足夠的測試,嗯?)。
無論如何,我之前測試的源目錄路徑的名稱中沒有空格,例如
/somedirectory/subfolder/src/
但是當我嘗試使用帶有空格的路徑運行腳本時,例如
/Documents\ and\ Settings/subfolder/src/
它不起作用。
我找到了問題所在,但我不確定如何解決它。 這是導致問題的代碼:
names=( $(find "${SOURCE_ROOT_DIRECTORY}" -regex "[A-Za-z0-9]*.*\(cpp\|h\|cc\)$"))
正則表達式適用於沒有空格的路徑,所以我不確定正則表達式是否有問題,或者“find”命令在遇到空格時是否停止。
任何人都可以幫忙嗎?
當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
規范的使用模式是:
find subfolder/ -type f -name '*.cpp' -print0 |
xargs -0rn1 myscript.py
這有所有的花里胡哨,你可能可以不用-type f
和一些 xargs 標志
你可以使用閱讀
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.