4

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

我使用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"

笔记

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

4

2 回答 2

6

一种选择可rename用于find

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

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

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

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

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

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

于 2013-09-26T16:12:05.253 回答
1

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

for f in **/*.bak; do mv -- "$f" "${f%.bak}"; done
于 2013-09-26T16:05:39.473 回答