我有一个文件夹结构
conf/
widget1/
env1.cfg
env2.cfg
widget2/
env1.cfg
env2.cfg
widget3/
env1.cfg
env2.cfg
widget4/
env1.cfg
env2.cfg
...
我想要做的是找到所有名为 的文件env2.cfg
,并在其名为 的目录中创建它们的副本env3.cfg
。
我试过了:
find -name env2.cfg -exec cp '{}' "env3.cfg" ";"
但刚刚env3.cfg
在conf/
目录中创建。
有什么想法吗?
为了澄清起见,我在 Mac OSX 上执行此操作,但理想情况下,如果可能的话,相同的命令应该在 CentOS 上运行。
答案1
尝试
find . -name env2.cfg -execdir cp {} env3.cfg \;
通过替换exec
为execdir
.这意味着您的“操作”( cp
) 将发生在env2.cfg
找到文件 ( ) 的文件夹内。
答案2
您的示例将所有 env2.cfg 文件复制到当前工作目录,即“.”。您需要给找到的文件起一个新名称,包括它的目录。这对我有用:
for file in $(find . -name env2.cfg); do backup=$(echo $file | sed 's/env2.cfg/env3.cfg/'); cp $file $backup; done
编辑:或者更优雅的方式,这样你就不必费心使用多个命令:
for file in $(find . -name env2.cfg); do cp $file ${file/env2/env3}; done
答案3
由于它是静态结构,您可以直接寻址文件名并让 shell 复制它们:
for f in conf/widget*/env2.cfg
do
cp "${f}" "${f/env2/env3}"
done