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

恢复使用find和sed创建的多个备份文件,sed,grep,find,xargs,Sed,Grep,Find,Xargs,我需要编辑名称中带有特定图案的文件。这些文件分布在多个分层目录中 我在xargs的帮助下,使用find后跟sed,以实现以下相同功能: find . -type f -name "file*" | sed -i.bak 's/word1/replace_word1/g' 我的问题是,现在我想恢复备份文件(*.bak)中的更改。示例目录树如下所示。我正在寻找linux命令(可能是一个链)来实现同样的功能 $ tree . |-- pdir1 | |-- dir1 | | |-- di

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

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


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

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

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

一个选项可以是使用
重命名
查找

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}
表示从参数末尾删除
.bak
。实际上,对于结果
foo.bak
,shell将发出命令
mv-f foo.bak foo

***。bak
仅适用于位于正确目录结构中的文件。我把文件分散在各处。可能我会将给定的示例更改为更复杂的示例无法使其工作:(
manrename
不显示任何
-f
选项。是否可以通过
mv
实现?谢谢!工作正常。
${0%.bak}
如何工作,我的意思是语法?非常感谢!这非常有用。