我有一个简单的问题,但没有指导尚未通过论坛或bash。问题如下:
我想为匹配* .h或* .cpp的目录中的每个文件名添加前缀字符串。但是,如果前缀已经应用于文件名,请不要再次应用它。
为什么以下不起作用还有待解决的问题:
for i in *.{h,cpp}
do
if [[ $i!="$pattern*" ]]
then mv $i $pattern$i
fi
done
答案 0 :(得分:2)
你可以试试这个:
for i in *.{h,cpp}
do
if ! ( echo $i | grep -q "^$pattern" )
# if the file does not begin with $pattern rename it.
then mv $i $pattern$i
fi
done
答案 1 :(得分:2)
其他人已经展示了有效的替代品比较;我会捅一下为什么原版没有。原始前缀测试有两个问题:比较运算符(!=
)与其操作数之间需要空格,星号用引号表示(意味着它按字面匹配,而不是作为通配符)。解决这些问题,并且(至少在我的测试中)它按预期工作:
if [[ $i != "$pattern"* ]]
答案 2 :(得分:1)
#!/bin/sh
pattern=testpattern_
for i in *.h *.cpp; do
case "$i" in
$pattern*)
continue;;
*)
mv "$i" "$pattern$i";;
esac
done
此脚本将在任何Posix shell中运行,而不仅仅是bash。 (我不确定你的问题是“为什么这不起作用”或“我怎么做这个工作”所以我猜这是第二个。)
答案 3 :(得分:0)
for i in *.{h,cpp}; do
[ ${i#prefix} = $i ] && mv $i prefix$i
done
不完全符合您的脚本,但它应该有效。如果没有前缀,则检查返回true(即,如果$ i,前缀“prefix”被删除,等于$ i)。