我对此工作正常:
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"
有什么不对?
答案 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
”需要转义。