找到使用多个名称模式

时间:2011-06-04 14:22:24

标签: perl bash shell

我对此工作正常:

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 个答案:

答案 0 :(得分:3)

以下是其他人提供的解决方案背后的一些解释。

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'

答案 1 :(得分:2)

你必须把它写成:

find Sources/$1-$2 -name '*.php' -o -name '*.rb' ....

答案 2 :(得分:2)

我猜你想要所有文件以.php和.rb结尾。

尝试find Sources/$1-$2 \( -iname "*.php" -o -iname "*.rb" \) -print |xargs perl -pi -e "s/domain.com/$2/g"

答案 3 :(得分:2)

使用[ef] grep过滤find的结果要好得多。为什么呢?

因为您可以将grep模式作为参数提供,或者可以从config或soo中读取它。写起来要容易得多:grep“$ PATTERN”用'-o'构造长查找参数。 (ofc,这里是找到args更好的情况),但不是你的情况。

成本是另一个过程。所以,对于你来说,编写脚本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 +,(和.bashrc中的shopt -s globstar),你可以简单地写一下:

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

**就像find -name

答案 4 :(得分:1)

顺便说一下,这里不需要xargs

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

另请注意/ . /中的“domain.com”需要转义。