簡體   English   中英

在 shell 腳本中使用“查找”時出現問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM