为什么这个shell不起作用

时间:2014-11-03 10:39:43

标签: shell find exec

让我们说有类似的目录和文件:

  • ./app/cores/a/conf/props.conf.indexer
  • ./app/cores/a/conf/props.conf.searcher
  • ./app/cores/b/conf/props.conf.indexer
  • ./app/cores/b/conf/props.conf.searcher
  • ./app/cores/c/conf/props.conf.indexer
  • ./app/cores/c/conf/props.conf.searcher

将app目录部署到索引器节点后,我想将app/cores/{core}/conf/props.conf.indexer更改为app/cores/{core}/conf/props.conf

这是我做的:

find ./app/cores/*/conf -name "props.conf.indexer" -exec echo $( cd $(dirname {}) && mv props.conf.indexer props.conf && ls -d props.conf ) \;

但是,它已返回(props.conf.indexer存在):

mv: rename props.conf.indexer to props.conf: No such file or directory

我的问题是,是否无法将{}占位符与$()表达式一起使用。

1 个答案:

答案 0 :(得分:1)

您不需要echo已发送文字的内容,$()内的所有内容都将在 find之前进行评估 (正如@Biffen指出的那样)。和ls -d有什么关系?当然props.conf不是目录吗?

这应该做你想要的:

for file in app/cores/*/conf/props.conf.indexer
do
    mv "$file" "${file%.indexer}"
done