Проблема с использованием "find" в сценариях оболочки - PullRequest
3 голосов
/ 05 июля 2011

Я недавно написал сценарий оболочки, который автоматически запускает сценарий python для любых файлов c ++, которые он может найти в указанном каталоге.Я проверил это, оно работало нормально, и я сохранил это и забыл об этом;проблема в том, что я вернулся, чтобы использовать его, и столкнулся с проблемой (оказывается, я недостаточно тестировал, а?).

В любом случае, пути к исходным каталогам, которые я тестировал ранее, не имели пробелов в своих именах, например

/somedirectory/subfolder/src/

Но когда я пытаюсь запустить скрипт, используя путь с пробелами в нем, например,

/Documents\ and\ Settings/subfolder/src/

Он не работает.

Я нашел гдепроблема в том, но я не уверен, как это исправить.Вот код, вызывающий проблему:

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

Регулярное выражение работает с путями без пробелов, поэтому я не уверен, что есть проблема с регулярным выражением, или если команда "find" останавливается, когдаон встречает пробел.

Кто-нибудь может помочь?

Ответы [ 3 ]

2 голосов
/ 05 июля 2011

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
2 голосов
/ 05 июля 2011

Каноническая схема использования:

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

Здесь есть все навороты, вы, вероятно, можете обойтись без -type f и, возможно, с некоторыми флагами xargs

1 голос
/ 05 июля 2011

вы можете использовать читать

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...