我正在尝试编写一个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。
这个错误可能是什么原因造成的?我怎么能调解它来单独获取文件名并删除尾随目录?
答案 0 :(得分:2)
{}
命令的-exec
标志的find
占位符不是变量。
您只能对变量执行参数扩展。
shell的问题与dash
或bash
无关。
在这种情况下,您可以使用sh
运行-exec
,
并将{}
作为参数传递给子shell,如下所示:
find ... -exec bash -c 'mv "$1" "./compressed/${1##*/}"' -- {} \;