首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >还原使用find创建的多个备份文件,后面跟着sed

问还原使用find创建的多个备份文件,后面跟着sed
EN

Stack Overflow用户
提问于 2013-09-26 15:57:38
回答 2查看 1.3K关注 0票数 4

我需要编辑的文件与特定的模式在他们的名字。这些文件分布在多个分层目录中。

我使用find,然后在sed的帮助下,在xargs的帮助下实现如下相同:

代码语言:javascript
复制
find . -type f -name "file*" | sed -i.bak 's/word1/replace_word1/g'

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

代码语言:javascript
复制
$ tree
.
|-- pdir1
|   |-- dir1
|   |   |-- dir2
|   |   |   |-- file2
|   |   |   `-- file2.bak
|   |   |-- file1
|   |   `-- file1.bak
|   `-- dir3
|       |-- file3
|       `-- file3.bak
`-- pdir2
    |-- file1
    `-- file1.bak

我可以使用下面的find命令找到所有备份文件。但不知道下一步该怎么做。如果你能帮我解决这个问题,我会很感激的。

代码语言:javascript
复制
find . -type f -name "file*.bak"

Note

我认为这个问题是一般情况下的。我曾多次面对这种情况,但却为之编写了一个小包装脚本。在这里,我希望有一个通用和简明的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-26 16:12:05

一种选择是将rename与find结合使用。

代码语言:javascript
复制
find . -type f -name "*.bak" -exec rename 's/\.bak$//' {} \;

如果存在foo.bak,这将不会重命名foo。为了强制覆盖,请为rename使用rename选项

代码语言:javascript
复制
find . -type f -name "*.bak" -exec rename -f 's/\.bak$//' {} \;

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

代码语言:javascript
复制
find . -name "*.bak" -exec sh -c 'mv -f $0 ${0%.bak}' {} \;

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

票数 6
EN

Stack Overflow用户

发布于 2013-09-26 16:05:39

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

代码语言:javascript
复制
for f in **/*.bak; do mv -- "$f" "${f%.bak}"; done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19033070

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档