加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

恢复使用find后跟sed创建的多个备份文件

发布时间:2020-12-14 00:30:00 所属栏目:Linux 来源:网络整理
导读:我需要在名称中编辑具有特定模式的文件.这些文件分布在多个分层目录中. 我在xargs的帮助下使用find后跟sed实现如下相同: find . -type f -name "file*" | sed -i.bak 's/word1/replace_word1/g' 我的问题是,现在我想从备份文件(* .bak)恢复更改.示例目录树
我需要在名称中编辑具有特定模式的文件.这些文件分布在多个分层目录中.

我在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"

注意

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

解决方法

一个选项可以是使用find重命名:

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

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

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

编辑:如果您不能使用重命名,请尝试:

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读