在bash中删除xargs {}中的字符

时间:2016-05-19 14:19:25

标签: bash substitution xargs string-substitution

假设我有名为"*.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

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

1 个答案:

答案 0 :(得分:3)

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

您可以使用:

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

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

while IFS= read -d '' -r f; do
    mv "$f" "${f/.done}"
done < <(grep -lRF "pattern" --include '*.data.done' --null .)