【问题标题】:Restore multiple backup files created with find followed by sed恢复使用 find 和 sed 创建的多个备份文件
【发布时间】:2013-10-02 16:57:45
【问题描述】:

我需要编辑名称中包含特定模式的文件。这些文件分布在多个分层目录中。

我在 xargs 的帮助下使用find 后跟sed 来实现以下相同:

find . -type f -name "file*" | sed -i.bak 's/word1/replace_word1/g'

我的问题是现在我想恢复备份文件 (*.bak) 中的更改。示例目录树将如下所示。我正在寻找 linux 命令(可能是一个链)来实现相同的。

$ tree
.
|-- pdir1
|   |-- dir1
|   |   |-- dir2
|   |   |   |-- file2
|   |   |   `-- file2.bak
|   |   |-- file1
|   |   `-- file1.bak
|   `-- dir3
|       |-- file3
|       `-- file3.bak
`-- pdir2
    |-- file1
    `-- file1.bak

我可以使用以下find 命令找到所有备份文件。但不知道下一步该做什么。如果您能帮我解决这个问题,那将是不言而喻的。

find . -type f -name "file*.bak"

注意

我将此问题视为一般情况。我曾多次遇到这种情况,但为它写了一个小包装脚本而侥幸逃脱。在这里,我希望有一个通用而简洁的解决方案。

【问题讨论】:

    标签: sed grep find xargs


    【解决方案1】:

    一个选项可以使用renamefind

    find . -type f -name "*.bak" -exec rename 's/\.bak$//' {} \;
    

    如果foo 存在,则不会重命名foo.bak。要强制覆盖,请为rename 使用-f 选项:

    find . -type f -name "*.bak" -exec rename -f 's/\.bak$//' {} \;
    

    编辑:如果您不能使用rename,请尝试:

    find . -name "*.bak" -exec sh -c 'mv -f $0 ${0%.bak}' {} \;
    

    上述(最后一个)命令的解释:对于find 返回的每个结果,调用一个将结果作为mv -f $0 ${0%.bak} 的参数(由{} 表示)的shell 命令。 $0 是一个位置参数,${0%.bak} 表示 shell parameter expansion 用于从参数末尾删除 .bak。实际上,对于结果foo.bak,shell 会发出命令mv -f foo.bak foo

    【讨论】:

    • 无法正常工作:(man rename 没有显示任何-f 选项。可以通过mv 进行吗?
    • 谢谢!效果很好。 ${0%.bak} 是如何工作的,我的意思是语法?
    • 非常感谢!这真的很有帮助。
    【解决方案2】:

    您可以简单地使用遍历目录的for 循环进行恢复。它不检查没有bak 扩展名的文件是否存在。

    for f in **/*.bak; do mv -- "$f" "${f%.bak}"; done
    

    【讨论】:

    • **/*.bak 仅适用于位于正确目录结构中的文件。我的文件分布在各处。可能我会将给定的示例更改为更复杂的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2016-08-10
    • 1970-01-01
    • 2015-09-26
    • 2021-02-05
    • 1970-01-01
    相关资源
    最近更新 更多