假设我有名为"*.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
我怎样才能以最简单的方式做到这一点?
答案 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 .)