【发布时间】:2018-05-22 19:37:54
【问题描述】:
我需要在一个目录及其子目录的所有文件中查找并替换一个单词。
我用了这行代码:
perl -pi -w -e 's/foo/bar/g;' *.*
但它只改变当前目录下文件中的文字,不影响子目录。
如何更改每个目录和子目录的单词?
【问题讨论】:
标签: macos perl directory macos-sierra
我需要在一个目录及其子目录的所有文件中查找并替换一个单词。
我用了这行代码:
perl -pi -w -e 's/foo/bar/g;' *.*
但它只改变当前目录下文件中的文字,不影响子目录。
如何更改每个目录和子目录的单词?
【问题讨论】:
标签: macos perl directory macos-sierra
您可以做一个纯粹的 Perl 解决方案,递归遍历您的目录结构,但这需要编写更多代码。
更简单的解决方案是使用find 命令,它可以被告知查找所有文件并针对它们运行命令。
find . -type f -exec perl -pi -w -e 's/foo/bar/g;' \{\} \;
(我已经避开了 {} 和 ; 以防万一,但你可能不需要这个)
【讨论】:
试试看:
find -type f | xargs -r -I {} perl -pi -w -e 's/foo/bar/g;' {}
这应该递归运行
如果您的文件名包含空格:
find -type f -print0 | xargs -r0 -I {} perl -pi -w -e 's/foo/bar/g;' {}
【讨论】:
-exec 没有提供您想要的功能,例如:并行...参见unix.stackexchange.com/questions/24954/when-is-xargs-needed 和unix.stackexchange.com/questions/321697/…