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

时间:2013-09-26 15:57:38

标签: sed grep find xargs

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

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

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"

注意

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

2 个答案:

答案 0 :(得分:6)

一个选项可以是renamefind

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

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

rename

编辑:如果您无法使用find . -type f -name "*.bak" -exec rename -f 's/\.bak$//' {} \; ,请尝试:

rename

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

答案 1 :(得分:1)

只需使用遍历目录的for循环即可恢复。它不会检查没有bak扩展名的文件是否存在。

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