【发布时间】:2016-07-24 03:11:48
【问题描述】:
我偶然发现了以下问题:在一行上,我想根据我找到的文件更改我的find 命令的结果以执行特定的cp,并带有目标名称取决于find 返回的文件。
这是我的文件,
$ find jcho -name *.data
jcho/category1/001.data
jcho/category2/002.data
它们必须复制到
jcho2/category1_001.data
jcho2/category2_002.data
我试过了,
$ find . -name *.data \
-exec cp {} ` echo {} | sed -re 's/(jcho\/)(category[0-9]*)(\/)(.*data)/jcho2\/\2_\4/' ` \;
但它说它想复制到同一个文件——我的替换没有完成;出现以下错误:
cp: './jcho/category1/001.data' 和 './jcho/category1/001.data' 是 同一个文件
所以我尝试了一个带有子shell的东西,我给出了查找的结果。 这奏效了(有点)。
find jcho -name *.data -exec sh -c \
'f="${0}"; d=$(echo ${f} | sed -re 's/0/2/' ); cp ${f} ${d} ' {} \;
==>
find jcho -name 2*.data
jcho/category1/201.data
jcho/category2/202.data
如果我可以在 sedpattern 中包含 /,我的解决方案就在眼前......
但我明白了:
find jcho -name *.data -exec sh -c \
'f="${0}"; d=$(echo ${f} | sed -re 's/(jcho\/)(category[0-9]*)(\/)(.*data)/jcho2\/\2_\4/' ); cp ${f} ${d} ' {} \;
-ksh: 语法错误:`(' 意外
...我尝试用\ 转义/,用\\...不是更好。
同理
find jcho -name *.data -exec sh -c \
'f="${0}"; d=$(echo ${f} | sed -re 's~\([^)]*\)/\([^()]*\)$~\1_\2~' ); cp ${f} ${d} ' {} \;
感谢您的帮助!
【问题讨论】:
-
这与
find -name使用正则表达式模式和使用cp[链接] (stackoverflow.com/questions/36396401/…) 替换文件名的问题相同。在那里查看答案。 -
不,它更具体。我尝试以不同的方式回答它,但不能。我的问题是用 sed 提出解决方案
标签: shell command-line sed find ksh