1

假设我有名为"*.data.done". 现在我想将它们(递归地)重命名为“* .data”,然后是那些包含"pattern"

所以我们开始:

grep -l -R -F "pattern" --include '*.data.done' * | xargs -I{} mv {} ${{}::-5}

好吧,这种“.done”的剥离不起作用(bash 4.3.11):

bash: ${{}::-5}: bad substitution

我怎样才能做到这一点最简单的方法?

4

1 回答 1

3

占位符{}不能用于 BASH 里面的字符串操作${...}

您可以使用:

grep -lRF "pattern" --include '*.data.done' . |
xargs -I{} bash -c 'f="{}"; mv "$f" "${f/.done}"'

但是,如果您想避免为每个文件生成子外壳,请使用 for 循环:

while IFS= read -d '' -r f; do
    mv "$f" "${f/.done}"
done < <(grep -lRF "pattern" --include '*.data.done' --null .)
于 2016-05-19T14:25:19.683 回答