假设我有名为"*.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
我怎样才能做到这一点最简单的方法?
假设我有名为"*.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
我怎样才能做到这一点最简单的方法?
占位符{}
不能用于 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 .)