Python 替换文件名、文件夹名和文件内容中的引用

Python 替换文件名、文件夹名和文件内容中的引用,python,bash,shell,Python,Bash,Shell,我有以下结构的文件夹和文件,其中一些文件包含字符串ModuleName ModuleName ├── Application\ Logic │   └── Interactor │   ├── ModuleNameInteractor.swift │   └── ModuleNameInteractorIO.swift ├── Module\ Interface │   └── IModuleNameModule.swift └── User\ Interface ├──

我有以下结构的文件夹和文件,其中一些文件包含字符串
ModuleName

ModuleName
├── Application\ Logic
│   └── Interactor
│       ├── ModuleNameInteractor.swift
│       └── ModuleNameInteractorIO.swift
├── Module\ Interface
│   └── IModuleNameModule.swift
└── User\ Interface
    ├── Presenter
    │   └── ModuleNamePresenter.swift
    ├── View
    │   ├── IModuleNameView.swift
    │   └── ModuleNameViewController.swift
    └── Wireframe
        └── ModuleNameWireframe.swift
我想用Linux或python脚本替换文件夹名、文件名和文件内容中出现的所有
ModuleName
(比如
TestModule


我尝试了使用
find
命令,但是重命名文件夹provoque
对于子文件夹/子文件,没有这样的文件或目录

我将使用
sed-I
(就地替换)进行内容替换,并使用
find | while read
循环进行重命名

以下是BSD sed(Mac上的标准)版本:

下面是GNU sed:

find . -type f -exec sed -e s/ModuleName/TestModule/g -i '{}' ';'
find . -depth -name '*ModuleName*' -print0|while IFS= read -rd '' f; do mv -i "$f" "$(echo "$f"|sed -r 's/(.*)ModuleName/\1TestModule/')"; done

while read
中的额外细节是正确处理任意文件名——带有空格和其他奇数字符的文件名。一些快速测试表明,zsh
read
现在可以正确处理以null结尾的字符串;如果您有问题,请尝试在bash中运行它。

尝试与终端抗争后,我发现免费提供的Massreplaceit应用程序可以非常轻松地处理此问题


附言:我不是在那里工作

关于
“我想替换…文件内容中出现的所有ModuleName”
例如,文件
ModuleNameInteractor.swift
包含以下代码
类ModuleNameInteractor:ModuleNameInteractorInput
执行脚本后,我想获得
类TestModuleInteractor:TestModuleInteractorInput
我已经修改了在mac中工作的命令(
find.-type f-name'*ModuleName*'''''-exec sh-c'mv“$0”“${0/ModuleName/Test}”'''{};find.-name'*ModuleName*'-print0;,而IFS=read-rd''f;do-mv I'$f'{f//ModuleName/Test}完成
)但是我有错误:(sed替换路径中的第一个出现)。我编辑它是为了得到一个正确的Mac版本,也是为了修复一个错误——我最初的重命名逻辑无法解释目录首先被重命名的事实,因此在第一个mv之后,文件不再可以通过其原始路径访问。修复方法是自下而上替换它们(
find-depth
),每次只更改每个路径中最后出现的
ModuleName
。它工作得非常好,谢谢!在OSX上,我有这样一条错误消息
sed:RE error:unliked byte sequence
,但是可以在这里找到解决方案,我假设错误出现在第一条语句中,即
sed-I
?你知道你正在编辑的文件是用什么字符编码的吗?
find . -type f -exec sed -e s/ModuleName/TestModule/g -i '{}' ';'
find . -depth -name '*ModuleName*' -print0|while IFS= read -rd '' f; do mv -i "$f" "$(echo "$f"|sed -r 's/(.*)ModuleName/\1TestModule/')"; done