найти, используя несколько шаблонов имен - PullRequest
1 голос
/ 04 июня 2011

У меня это нормально работает:

find Sources/$1-$2 -name '*' |xargs perl -pi -e "s/domain.com/$2/g"

Но когда я изменяю его на следующее, это не так:

find Sources/$1-$2 -name '*.php,*.rb' |xargs perl -pi -e "s/domain.com/$2/g"

Что не так?

Ответы [ 5 ]

3 голосов
/ 04 июня 2011

Вот некоторые объяснения решения, предоставленного другими.

Тесты в команде find объединяются с логическими операторами:

-a  -and
-o  -or
 !  -not

Если вы не предоставляете оператора, по умолчанию -and.

find . -type f    -name '*.rb'  # The command as entered.

find . -type f -a -name '*.rb'  # Behind the scenes.

Не удалось выполнить поиск, так как не найдено подходящих файлов:

# Would find only files with bizarre names like 'foo.php,bar.rb'
find . -name '*.php,*.rb'

Вам необходимо предоставить расширения файлов в виде отдельных -name тестов, объединенных OR.

find . -name '*.php' -o -name '*.rb'
2 голосов
/ 05 июня 2011

Гораздо лучше отфильтровать результат поиска с помощью [ef] grep. Почему?

Потому что вы можете использовать шаблон grep в качестве аргумента или читать его из конфига или soo. Гораздо проще написать: grep "$ PATTERN" как конструирующий аргументы long find с '-o'. (ofc, здесь есть ситуации, когда поиск аргументов лучше), но не в вашем случае.

Стоимость - это еще один процесс. Итак, для вашего примера легко написать скрипт myscript.sh

find Sources/$1-$2 -print | egrep -i "$3" | xargs ...

Вы можете назвать это

./myscript.sh aaa bbb ".(php|rb)$"

и результат будет эквивалентен более сложному

find Sources/$1-$2 \( -iname '*.php' -o -iname '*.rb' \) | xargs ...

но

зачем? Если у вас есть bash4 +, (и shopt -s globstar в вашем .bashrc), вы можете просто написать:

perl -pi -e '.....' Sources/aaa-bbb/**/*.{rb,php}

** походит на find -name.

2 голосов
/ 04 июня 2011

Я предполагаю, что вы хотите, чтобы все файлы заканчивались на .php и .rb.

Попробуйте find Sources/$1-$2 \( -iname "*.php" -o -iname "*.rb" \) -print |xargs perl -pi -e "s/domain.com/$2/g"

2 голосов
/ 04 июня 2011

Вы должны написать это как:

find Sources/$1-$2 -name '*.php' -o -name '*.rb' ....
1 голос
/ 05 июня 2011

Кстати, xargs здесь не нужен.

find Sources/$1-$2 \( -name '*.php' -o -name '*.rb' \) \
   -exec perl -i -pe "s/domain\.com/$2/g" {} +

Также обратите внимание, что "." в / domain.com / необходимо экранировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...