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
中的额外细节是正确处理任意文件名——带有空格和其他奇数字符的文件名。一些快速测试表明,zshread
现在可以正确处理以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