如何找到并替换每次出现的事件:
同
在/home/www/目录树下的每个文本文件中递归?
-
提示:请勿在svn结帐树??中执行以下操作...它将覆盖magic .svn文件夹文件。
-
哦,天哪,这正是我刚刚做的。但它起作用,似乎没有造成任何伤害。可能发生的最坏情况是什么?
-
@ J.Katzwinkel:至少,它可能会破坏校验和,这可能会损坏您的存储库。
-
使用相对路径。
-
使用sed的所有人的快速提示:它将为您的文件添加尾随换行符。如果你不想要它们,首先做一个与任何东西都不匹配的find-replace,并将它提交给git。然后做真正的。然后以交互方式重新绑定并删除第一个。
-
@funroll或使用不强制添加换行符的工具。比如Perl;或接受POSIX严格要求文本文件具有行结尾的事实。
-
在管道到xargs之前,可以使用find . -path ./.git -prune -o -type f -name '*matchThisText*' -print0中的-path ./.git -prune -o从结果中排除目录,例如git
-
Unix StackExchange网站上的这个答案也非常简洁:unix.stackexchange.com/a/112024/354626
1
| find /home/www \( -type d -name .git -prune \) -o -type f -print0 | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' |
来自man find:
-print0 (GNU find only) tells find to use the null character (\0) instead of whitespace as the output delimiter between pathnames found. This is a safer option if your files can contain blanks or other special characters. It is recommended to use the -print0 argument to find if you use -exec or xargs (the -0 argument is needed in xargs.)
-
在OSX上,您可能会遇到sed: 1:"...": invalid command code .问题。似乎-i选项需要扩展并解析's/../...'命令。解决方案:将扩展名''传递给-i选项,如sed -i '' 's/...。
-
注意:如果你在目录上使用它并想知道为什么svn st没有显示任何更改,那是因为你已经修改了.svn目录中的文件!请改用find . -maxdepth 1 -type f -print0 | xargs -0 sed -i 's/toreplace/replaced/g'。
-
另外,如果你是一个git仓库,要小心。我认为我在一个明确的分支上测试它是聪明的,所以如果它做了坏事,我可以恢复,但反而损坏了我的git索引。
-
没有为我工作,但这适用于Linux(测试):找到。 -name"* .java"-print0 | xargs -0 sed -i'' - e's / str1 / str2 / g'
-
当我尝试使用此命令将其限制为某种文件类型时,我收到语法错误。我怎么能限制这个命令的文件类型?
-
在OSX上,您还可以"port install gsed"(GNU sed),然后将"sed"替换为"gsed"以获取GNU版本。
-
使用此grep -r 'hello' -l --null . | xargs -0 sed -i 's#hello#world#g'可避免编辑不相关的文件(sed可能会更改文件编码)。
-
如果您在OSX上并且sed在运行此命令时给出"sed:RE错误:非法字节序列",请在命令前加上LC_ALL = C或在此处查看相关帖子:stackoverflow.com/questions/19242275/
-
大!!!这个命令给了我很多帮助...只是有一个小问题,如果我只想匹配某种类型的文件,如* .jsp文件,或* .html文件,该怎么办?
-
如果要将查找限制为java文件类型,请添加-name"* .java",例如:find / home / www -name"* .java"-type f -print0 | xargs -0 sed -i's / subdomainA.example.com / subdomainB.example.com / g'
-
忽略隐藏的目录:find . -not -path '*/\.*' -type f -print0 | xargs -0 sed -i 's/subdomainA.example.com/subdomainB.example.com/g'
-
"但反而损坏了我的git索引。"不要太担心这个,你可以做find .git ... | ... 'sed -i s/(the opposite from before)/g'来修复你的git索引
-
如果存在任何权限问题,此命令可以无提示失败(在Windows 8 cygwin上验证)。让我们说find抱怨目录B说sed: couldn't open temporary file ./B: Permission denied然后它可能会以静默方式跳过许多其他目录,如目录A。即使直接在目录A上运行命令成功完成,也没有权限问题。
-
沉默错误似乎与stackoverflow.com/questions/7733922/有关
-
对任何使用CVS运行此命令可能是个坏主意。除非您修改Rohmer的注释以忽略CVS目录
-
当您使用git仓库时,建议的查找/替换方法是什么? @Jimmy Kanes的回答?
-
在MacOSX上我得到sed: RE error: illegal byte sequence。我打算用vim代替。
-
@voutasaurus我收到了各种奇怪的消息,直到我传递一个空字符串作为-i选项的扩展名。请参阅Robert Lujo的评论。
-
在包含许多文件的文件夹上,它将达到shell参数限制。
-
如果确实需要在包含.git repo的文件夹中运行此命令,请在-print0之前添加-not -path"./.git/*"以排除该路径。如果要排除其他目录,也可以继续添加-not -path"./whatever/*。
-
有人可以向我解释为什么第一个字符串(搜索字符串)需要转义句点字符而第二个字符串(替换字符串)不需要吗?
-
如何在git仓库中安全地完成它?这就是我现在遇到的问题。
-
@squarecandy因为搜索字符串实际上是一个正则表达式,其中.代表"任何字符",而在替换字符串.中没有特殊含义。
-
使用brew,它在MacOS上是brew install gnu-sed。然后在命令中用gsed替换sed。
-
让我感到困惑的事情:find的参数顺序非常重要。 find foo -type f -print0与find foo -print0 -type f完全不同。 find foo -type f -print0将打印foo目录中的每个常规文件,后跟空字符。 find foo -print0 -type f将打印foo及其所有后代,无论其类型如何。 (find foo -print0 -type f相当于find foo -print0。)请参阅man7.org/linux/man-pages/man1/find.1.html#EXPRESSION。 -type是"测试",-print0是"动作"。
-
我成功地使用了这个命令,但我想问:有没有办法让这个给我一些关于它做了什么的反馈?至少有一些文件被更改,甚至可能是他们的名字列表?
-
@DylanReile对-prune更有效 - 在-type f之前添加\( -type d -name .git -prune \) -o。这样它就不会检查.git中的每个文件,它只是完全跳过目录。
注意:不要在包含git repo的文件夹上运行此命令 - 更改为.git可能会损坏您的git索引。
1 2
| find /home/www/ -type f -exec \
sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' {} + |
与此处的其他答案相比,这比大多数答案更简单,并使用sed而不是perl,这是原始问题所要求的。
-
请注意,如果您正在使用BSD sed(包括在Mac OS X上),则需要为sed的-i选项提供一个明确的空字符串arg。即:sed -i '' 's/original/replacement/g'
-
@DanCarley不,由于所有的分叉,它的效率低于Nikita的xargs解决方案
-
@JohnZwinck我的错误,错过了+。奇怪的是,尼基塔的解决方案对我来说运行得更快。
-
@JohnZwinck:只有一个问题:如何排除二进制文件(可执行文件)?
-
@ user2284570:find /home/www/ ! -executable ....
-
@JohnZwinck:不,它将排除shell脚本。
-
@ user2284570:哦,我现在看到了你想要的东西。您可能必须使用类似file的程序来检测循环中每个文件的类型。使用find生成文件列表,然后使用Bash进行后处理以删除二进制文件。
-
'+'很奇怪,我倾向于把;在查找结束时(反斜杠分号),应该在大多数shell中工作(bash,zsh,dash,...)
-
@AoeAoe:+大大减少了生成的sed进程的数量。它效率更高。
-
如何在带有git repo的文件夹中安全地执行此操作?
-
如果从查找结果中排除repo,则可以安全地在包含git repo的文件夹上执行:find . -not -path '*/\.git*' -type f ...。
-
如果任何子目录包含空格,这将不起作用。它应该是find /home/www/ -type f -exec sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g'"{}" +注意大括号周围的双引号。
-
@TimothyZorn:在我的系统(OS X)上,无论哪种方式都可以。但支持所有角色已经通过ep3static接受的答案解决了。
-
当然,但是使用find调用xargs来调用sed比使用find调用sed效率低得多。这是最好的答案,并且在大括号周围使用双引号会更好。
-
@DaleAnderson或者只是-prune它
对我来说最简单的方法是
1
| grep -rl oldtext . | xargs sed -i 's/oldtext/newtext/g' |
-
@Anatoly:只有一个问题:如何排除二进制文件(可执行文件)?
-
@ user2284570使用-I或--binary-file=without-match grep标志。
-
当你需要排除目录时,这很有效,例如.svn。例如:grep -rl oldtext . --exclude-dir=.svn | xargs sed -i 's/oldtext/newtext/g'
-
实际效率不同于其他在这里评价很高的答案。
-
brew install gnu-sed并在OSX上使用gsed以避免痛苦的世界。
所有技巧几乎相同,但我喜欢这个:
1
| find <mydir> -type f -exec sed -i 's/<string1>/<string2>/g' {} + |
-
find :在目录中查找。
-
-type f:
File is of type: regular file
-
-exec command {} +:
This variant of the -exec action runs the specified command on the selected files, but the command line is built by appending
each selected file name at the end; the total number of invocations of the command will be much less than the number of
matched files. The command line is built in much the same way that xargs builds its command lines. Only one instance of
`{}' is allowed within the command. The command is executed in the starting directory.
-
带有-exec的@ user2284570?尝试将路径设置为可执行文件而不是工具名称。
-
@ I159:否:排除可执行二进制文件(但包括shell脚本)。
-
@ I159这个答案与John Zwinck的答案完全相同吗?
-
@ user2284570"二进制文件"的概念并不完全明确。您可以使用file命令尝试确定每个文件的类型,但其输出中随意的变化可能会略微令人困惑。 -I(又名--mime)选项有所帮助,或--mime-type(如果有)。令人遗憾的是,如何精确地重构这个简洁的单行代码来完成这个微小的评论框。如果您需要帮助,可能会发一个单独的问题? (也许在这里添加带有链接的评论。)
-
最干净的答案!谢了哥们
1 2
| cd /home/www && find . -type f -print0 |
xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' |
-
也许在perl s ///替换的前半部分点之前放回波,但它不太重要。
-
我很好奇,是否有理由使用-print0和xargs而不是-exec或-execdir?
-
有:来自"man find":为每个匹配的文件运行一次指定的命令。也就是说,如果/ home / www中有2000个文件,那么'find ... -exec ...'将导致2000个perl调用;而'找到... | xargs ...'只会调用perl一次或两次(假设ARG_MAX约为32K,平均文件名长度为20)。
-
@Employed Russian:这就是你使用find -exec command {} +的原因 - 它确实避免了像xargs这样的命令的过度调用,但没有单独的进程。
-
在哪个平台上? xargs解决方案是可移植的,"find ... -exec"的"神奇"调用不会为找到的每个文件调用子进程。
-
你是对的,并非所有系统都支持+终止符find -exec。另一方面,并??非所有系统都支持-print0。
-
@EmployedRussian,find -exec ... {} +自2006年以来一直是POSIX指定的。
对我来说,最简单的解决方案是https://stackoverflow.com/a/2113224/565525,即:
1
| sed -i '' -e 's/subdomainA/subdomainB/g' $(find /home/www/ -type f) |
注意:-i ''解决OSX问题sed: 1:"...": invalid command code .
注意:如果要处理的文件太多,您将获得Argument list too long。解决方法 - 使用上述find -exec或xargs解决方案。
-
在所有情况下,workaround应该是首选语法。
-
命令substitution $(find...)的问题在于shell无法处理带有空格或其他shell元字符的文件名。如果你知道这不是问题,这种方法很好;但我们有太多的问题,人们没有对这个问题发出警告,或者没有理解警告。
对于任何使用银色搜索器的人(ag)
1
| ag SearchString -l0 | xargs -0 sed -i 's/SearchString/Replacement/g' |
由于ag默认忽略git / hg / svn文件/文件夹,因此可以安全地在存储库中运行。
要将文件减少为递归sed,您可以grep为您的字符串实例:
1
| grep -rl /path/to/folder | xargs sed -i s^^<newstring>^g |
如果你运行man grep,你会注意到你也可以定义一个--exlude-dir="*.git"标志,如果你想省略搜索.git目录,避免git索引问题,正如其他人礼貌地指出的那样。
引导您:
1
| grep -rl --exclude-dir="*.git" /path/to/folder | xargs sed -i s^^<newstring>^g |
一个不错的oneliner作为额外的。使用git grep。
1
| git grep -lz 'subdomainA.example.com' | xargs -0 perl -i'' -pE"s/subdomainA.example.com/subdomainB.example.com/g" |
-
如果你没有冒险覆盖.git / contents的风险,那么在git repo中工作是个好主意(如另一个答案的评论中所述)。
这个与git存储库兼容,有点简单:
Linux的:
1
| git grep -l 'original_text' | xargs sed -i 's/original_text/new_text/g' |
苹果电脑:
1
| git grep -l 'original_text' | xargs sed -i '' -e 's/original_text/new_text/g' |
(感谢http://blog.jasonmeridth.com/posts/use-git-grep-to-replace-strings-in-files-in-your-git-repository/)
-
更明智地将git-grep的-z选项与xargs -0一起使用。
-
git grep显然只在git回购中有意义。一般替换将是grep -r。
-
@gniourf_gniourf你能解释一下吗?
-
@PetrPeller:使用-z,git-grep将输出字段与空字节而不是换行分开;并且使用-0,xargs将读取由空字节分隔的输入,而不是空白(而不是带引号的怪异东西)。因此,如果您不希望命令在文件名包含空格,引号或其他有趣字符时中断,则命令为:git grep -z -l 'original_text' | xargs -0 sed ...。
1
| find /home/www/ -type f -exec perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} + |
find /home/www/ -type f将列出/ home / www /(及其子目录)中的所有文件。
"-exec"标志告诉find在找到的每个文件上运行以下命令。
1
| perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' {} + |
是对文件运行的命令(一次多个)。 {}被文件名替换。
命令末尾的+告诉find为许多文件名构建一个命令。
根据find手册页:
"命令行的构建方式大致相同
xargs构建了命令行。"
因此,可以在不使用xargs -0或-print0的情况下实现目标(并处理包含空格的文件名)。
我只需要这个并且对可用示例的速度不满意。所以我想出了自己的:
1
| cd /var/www && ack-grep -l --print0 subdomainA.example.com | xargs -0 perl -i.bak -pe 's/subdomainA\.example\.com/subdomainB.example.com/g' |
Ack-grep在查找相关文件方面非常有效。这个命令轻而易举地取代了~14.5万个文件,而其他文件花费了很长时间,我不能等到它们完成。
-
很好,但grep -ril 'subdomainA' *远不及grep -Hr 'subdomainA' * | cut -d: -f1那么快。
-
@Henno:只有一个问题:如何排除二进制文件(可执行文件)?
-
ack-grep会自动为您完成。
-
@Henno:它包含shell脚本吗?
-
是。以下是它支持的文件类型的完整列表:beyondgrep.com/documentation
grep -lr 'subdomainA.example.com' | while read file; do sed -i"s/subdomainA.example.com/subdomainB.example.com/g""$file"; done
我猜大多数人都不知道他们可以将某些内容传递到"while read file"中,它可以避免那些讨厌的-print0 args,同时在文件名中预先设置空格。
在sed之前进一步添加echo可以让您在实际执行之前查看哪些文件会发生变化。
-
-print0有用的原因是它处理while read无法处理的情况 - 换行是Unix文件名中的有效字符,因此为了使代码完全健壮,它需要处理这样的文件名也是。 (另外,您希望read -r避免在read中出现一些令人讨厌的POSIX遗留行为。)
-
此外,如果没有匹配,sed是无操作,因此grep不是必需的;虽然它是一个有用的优化,可以避免重写不包含任何匹配项的文件,如果你有很多这些,或者想要避免不必要地更新文件上的日期戳。
您可以使用awk解决此问题,如下所示,
1 2 3 4
| for file in `find /home/www -type f`
do
awk '{gsub(/subdomainA.example.com/,"subdomainB.example.com"); print $0;}' $file > ./tempFile && mv ./tempFile $file;
done |
希望对你有帮助 !!!
-
适用于MacO,没有任何问题!即使使用osx特定设置,所有基于sed的命令也会在包含二进制文件时失败。
-
小心......如果find返回的任何文件在其名称中有空格,这将会爆炸!使用while read更安全:stackoverflow.com/a/9612560/1938956
试试这个:
1
| sed -i 's/subdomainA/subdomainB/g' `grep -ril 'subdomainA' *` |
-
嗨@RikHic,很好的提示 - 正在考虑这样的事情;不幸的是,上面的格式不太正确:)所以我会尝试使用预标记(不起作用) - 所以转义反引号然后:sed -i 's/subdomainA/subdomainB/g'`grep -ril 'subdomainA' /home/www/*` - 这仍然不看太好了,但应该活着copypaste :)干杯!
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #!/usr/local/bin/bash -x
find * /home/www -type f | while read files
do
sedtest=$(sed -n '/^/,/$/p'"${files}" | sed -n '/subdomainA/p')
if ["${sedtest}" ]
then
sed s'/subdomainA/subdomainB/'g"${files}">"${files}".tmp
mv"${files}".tmp"${files}"
fi
done |
这是一个应该比大多数更通用的版本;例如,它不需要find(使用du代替)。它需要xargs,它只能在Plan 9的某些版本中找到(如9front)。
1
| du -a | awk -F' ' '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g' |
如果要添加文件扩展名等过滤器,请使用grep:
1
| du -a | grep"\.scala$" | awk -F' ' '{ print $2 }' | xargs sed -i -e 's/subdomainA\.example\.com/subdomainB.example.com/g' |
我只是使用上衣:
1 2
| find . -name '*.[c|cc|cp|cpp|m|mm|h]' -print0 | xargs -0 tops -verbose replace"verify_noerr(<b args>)" with"__Verify_noErr()" \
replace"check(<b args>)" with"__Check()" |
根据这篇博文:
1
| find . -type f | xargs perl -pi -e 's/oldtext/newtext/g;' |
-
你如何逃避斜线/?例如,我想替换xxx.xxx.xxx.xxx/folder的IP地址:xxx.xxx.xxx.xxx
-
您可以使用来转义/。例如:find . -type f | xargs perl -pi -e 's/xxx.xxx.xxx.xxx\/folder/newtext/g;'
有点老派,但这适用于OS X.
几乎没有技巧:
?仅编辑当前目录下扩展名为.sls的文件
?必须转义.以确保sed不将它们评估为"任何字符"
? ,用作sed分隔符,而不是通常的/
另请注意,这是编辑一个Jinja模板以在import的路径中传递variable(但这是偏离主题的)。
首先,验证您的sed命令是否符合要求(这只会将更改打印到stdout,它不会更改文件):
1 2
| for file in $(find . -name *.sls -type f); do echo -e"
$file:"; sed 's,foo\.bar,foo/bar/"+baz+"/,g' $file; done |
准备好进行更改后,根据需要编辑sed命令:
1 2
| for file in $(find . -name *.sls -type f); do echo -e"
$file:"; sed -i '' 's,foo\.bar,foo/bar/"+baz+"/,g' $file; done |
请注意sed命令中的-i '',我不想创建原始文件的备份(如在OS X上使用sed进行就地编辑或在此页面中的Robert Lujo的注释中所述)。
快乐的人们!
只是为了避免改变
-
NearlysubdomainA.example.com
-
subdomainA.example.comp.other
但仍然
-
subdomainA.example.com.IsIt.good
(也许在域根背后的想法不好)
1
| find /home/www/ -type f -exec sed -i 's/\bsubdomainA\.example\.com\b/\1subdomainB.example.com\2/g' {} \; |
如果您不介意将vim与grep或find工具一起使用,则可以在此链接中跟进用户Gert给出的答案 - >如何在大文件夹层次结构中进行文本替换?
这是交易:
-
以递归方式grep查找要在特定路径中替换的字符串,并仅获取匹配文件的完整路径。 (那将是$(grep 'string' 'pathname' -Rl)。
-
(可选)如果要在集中目录中对这些文件进行预备,也可以使用它:cp -iv $(grep 'string' 'pathname' -Rl) 'centralized-directory-pathname'
-
之后,您可以按照类似于给定链接上提供的方案,在vim中随意编辑/替换:
-
:bufdo %s#string#replacement#gc | update
要替换git存储库中的所有匹配项,您可以使用:
1
| git ls-files -z | xargs -0 sed -i 's/subdomainA\.example\.com/subdomainB.example.com/g' |
请参阅本地git repo中的列表文件?用于列出存储库中所有文件的其他选项。 -z选项告诉git将文件名与零字节分开,这确保xargs(使用选项-0)可以分隔文件名,即使它们包含空格或诸如此类的东西。
1
| perl -p -i -e 's/oldthing/new_thingy/g' `grep -ril oldthing *` |
-
不使用awk / sed,但perl很常见(除了仅使用busybox的嵌入式/系统)。
使用grep和sed的组合
1 2 3 4
| for pp in $(grep -Rl looking_for_string)
do
sed -i 's/looking_for_string/something_other/g'"${pp}"
done |
-
mywiki.wooledge.org/DontReadLinesWithFor
-
@tripleee我修改了一下。在这种情况下,输出命令grep -Rl pattern生成模式所在的文件列表。在for循环中不读取文件。
-
咦?你仍然有一个for循环;如果任何返回的文件名包含空格,它将无法正常工作,因为shell会标记for参数列表。但是你在循环中使用没有引号的文件名变量,所以如果你修复它,它会在那里打破。纠正这些剩余的错误会使你的问题与@ MadMan2064的答案相同。
-
@tripleee是的,这是真的,我错过了这个。
更改多个文件(并将备份保存为*.bak):
1
| perl -p -i -e"s/\|/x/g" * |
将获取目录中的所有文件并将|替换为x
被称为"Perl馅饼"(简单的馅饼)
-
虽然不是通过目录递归。
-
可以管道到它,这使它非常可调,包括通过目录。 josephscott.org/archives/2005/08/和unix.stackexchange.com/questions/101415/
对于IBMi上的Qshell(qsh),不是由OP标记的bash。
qsh命令的局限性:
-
find没有-print0选项
-
xargs没有-0选项
-
sed没有-i选项
因此qsh中的解决方案:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| PATH='your/path/here'
SEARCH=\'subdomainA.example.com\'
REPLACE=\'subdomainB.example.com\'
for file in $( find ${PATH} -P -type f ); do
TEMP_FILE=${file}.${RANDOM}.temp_file
if [ ! -e ${TEMP_FILE} ]; then
touch -C 819 ${TEMP_FILE}
sed -e 's/'$SEARCH'/'$REPLACE'/g' \
< ${file} > ${TEMP_FILE}
mv ${TEMP_FILE} ${file}
fi
done |
注意事项:
如果您想在不完全破坏SVN存储库的情况下使用它,可以通过执行以下操作告诉"find"忽略所有隐藏文件:
1
| find . \( ! -regex '.*/\..*' \) -type f -print0 | xargs -0 sed -i 's/subdomainA.example.com/subdomainB.example.com/g' |
-
括号似乎是多余的。之前有一个格式化错误,使其无法使用(Markdown呈现会吃正则表达式中的一些字符)。
如果您需要排除目录(--exclude-dir=.svn)并且可能包含带空格的文件名(使用带有grep -Z和xargs -0的0Byte)的直接方法
1
| grep -rlZ oldtext . --exclude-dir=.svn | xargs -0 sed -i 's/oldtext/newtext/g' |
将所有匹配string_1的内??容替换为当前目录和子目录中所有.c和.h文件的string_2(不包括.git /)。
这适用于Mac:
1 2
| find . -type f -path"*.git*" -prune -o -name '*\.[ch]' -exec \
sed -i '' -e 's/'$1'/'$2'/g' {} + |
这应该适用于Linux(尚未测试):
1 2
| find . -type f -path"*.git*" -prune -o -name '*\.[ch]' -exec \
sed -i 's/string_1/string_2/g' {} + |
这是我为OSX和Windows(msys2)找到的最佳解决方案。应该可以使用任何可以获得sed的gnu版本的东西。跳过.git目录,这样它就不会破坏你的校验和。
在Mac上,只需先安装coreutils并确保gsed在路径中 -
然后我把这个函数粘贴在我的zshrc / bashrc - >中
1 2 3 4 5 6
| replace-recursive() {
hash gsed 2>/dev/null && local SED_CMD="gsed" || SED_CMD="sed"
find . -type f -name"*.*" -not -path"*/.git/*" -print0 | xargs -0 $SED_CMD -i"s/$1/$2/g"
}
usage: replace-recursive <find> <replace> |
一种更简单的方法是在命令行中使用以下内容
1
| find /home/www/ -type f|xargs perl -pi -e 's/subdomainA\.example\.com/subdomainB.example.com/g' |
如果您有权访问节点,则可以执行npm install -g rexreplace
1
| rexreplace 'subdomainA.example.com' 'subdomainB.example.com' /home/www/**/*.* |