【问题标题】:Replace the occurrences in file name, folder name and file content替换文件名、文件夹名和文件内容中的出现
【发布时间】:2022-02-15 02:57:38
【问题描述】:

我有以下结构的文件夹和文件,其中一些文件包含字符串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 No such file or directory

【问题讨论】:

  • 你能多谈谈"I want to replace all the occurrences of ModuleName in ... file content"
  • 例如文件ModuleNameInteractor.swift包含如下代码class ModuleNameInteractor : ModuleNameInteractorInput,执行脚本后我想得到class TestModuleInteractor : TestModuleInteractorInput

标签: python bash shell


【解决方案1】:

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

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

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 -E 's/(.*)ModuleName/\1TestModule/')"; done

这里是 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 中运行它。

【讨论】:

  • 我已修改命令以在 mac (find . -type f -name '*ModuleName*' -exec sh -c 'mv "$0" "${0/ModuleName/Test}"' '{}' \; find . -name '*ModuleName*' -print0|while IFS= read -rd '' f; do mv -i "$f" "${f//ModuleName/Test}"; done) 中工作,但出现错误:0bin.net/paste/…(sed 替换路径中的第一个匹配项)。
  • 我已经对其进行了编辑,以提供我希望是正确的 Mac 版本,并修复了一个错误——我最初的重命名逻辑未能解释目录首先被重命名的事实,所以在第一个 mv 之后,文件不再可以通过其原始路径访问。解决方法是从下往上 (find -depth) 替换它们,每次只更改每个路径中 ModuleName最后次出现。
  • 完美运行,谢谢!在 OSX 上,我收到此错误消息 sed: RE error: illegal byte sequence,但可以在此处找到解决方案 stackoverflow.com/questions/19242275/…
  • 我假设错误出现在第一条语句中,sed -i?你知道你正在编辑的文件是用什么字符编码的吗?
【解决方案2】:

在尝试与终端战斗后,发现免费提供的Massreplaceit应用here可以非常轻松地解决这个问题

PS:我不在那儿工作!

【讨论】:

    猜你喜欢
    • 2017-01-31
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-11-23
    • 2011-02-09
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多