jks*_*hah 4 grep sed find xargs
我需要在名称中编辑具有特定模式的文件.这些文件分布在多个分层目录中.
我正在使用find
其后sed
的帮助xargs
实现如下相同:
find . -type f -name "file*" | sed -i.bak 's/word1/replace_word1/g'
Run Code Online (Sandbox Code Playgroud)
我的问题是,现在我想从备份文件(*.bak)恢复更改.示例目录树将如下所示.我正在寻找linux命令(可能是一个链)来实现相同的.
$ tree
.
|-- pdir1
| |-- dir1
| | |-- dir2
| | | |-- file2
| | | `-- file2.bak
| | |-- file1
| | `-- file1.bak
| `-- dir3
| |-- file3
| `-- file3.bak
`-- pdir2
|-- file1
`-- file1.bak
Run Code Online (Sandbox Code Playgroud)
我可以使用以下find
命令找到所有备份文件.但无法弄清楚下一步该做什么.如果你可以帮我解决这个问题,那将会很明显.
find . -type f -name "file*.bak"
Run Code Online (Sandbox Code Playgroud)
注意
我将此问题视为一般情况.我曾多次遇到这种情况,但却为此编写了一个小包装脚本.在这里,我希望有一个通用而简洁的解决方案.
一种选择是使用rename
具有find
:
find . -type f -name "*.bak" -exec rename 's/\.bak$//' {} \;
Run Code Online (Sandbox Code Playgroud)
foo.bak
如果foo
存在,则不会重命名.为了强制覆盖,请使用以下-f
选项rename
:
find . -type f -name "*.bak" -exec rename -f 's/\.bak$//' {} \;
Run Code Online (Sandbox Code Playgroud)
编辑:如果你不能使用rename
,请尝试:
find . -name "*.bak" -exec sh -c 'mv -f $0 ${0%.bak}' {} \;
Run Code Online (Sandbox Code Playgroud)
上述(最后)命令的说明:对于返回的每个结果find
,调用一个shell命令,该命令将结果作为参数(表示为{}
)for mv -f $0 ${0%.bak}
. $0
是一个位置参数,${0%.bak}
表示从参数末尾删除的shell参数扩展.bak
.实际上,对于结果foo.bak
,shell将发出命令mv -f foo.bak foo
.