非短划线相关的错误替换错误

时间:2017-11-09 20:33:04

标签: linux bash shell path substitution

我正在尝试编写一个bash脚本,用于查找并在其他地方提取特定的文件类型。到目前为止,我想出了以下脚本:

find ./to_compress -type f -iname "*.tar" -mindepth 1 -maxdepth 1 -exec mv {} ./compressed/${{}##*/}

然而,bash抱怨${{}##*/}是一个糟糕的替代

bash: ./compressed/${{}##*/}: bad substitution

一些谷歌搜索表明它可能是由于-exec调用dash而不是bash,我检查了

find ./to_compress -type f -iname "*.tar" -mindepth 1 -maxdepth 1 -exec echo $0 {} \;

bin/bash xxxx回复,表明执行命令确实调用了bash。

这个错误可能是什么原因造成的?我怎么能调解它来单独获取文件名并删除尾随目录?

1 个答案:

答案 0 :(得分:2)

{}命令的-exec标志的find占位符不是变量。 您只能对变量执行参数扩展。 shell的问题与dashbash无关。

在这种情况下,您可以使用sh运行-exec, 并将{}作为参数传递给子shell,如下所示:

find ... -exec bash -c 'mv "$1" "./compressed/${1##*/}"' -- {} \;