bash文件名开始匹配

时间:2010-09-19 17:52:18

标签: bash pattern-matching filenames

我有一个简单的问题,但没有指导尚未通过论坛或bash。问题如下:

我想为匹配* .h或* .cpp的目录中的每个文件名添加前缀字符串。但是,如果前缀已经应用于文件名,请不要再次应用它。

为什么以下不起作用还有待解决的问题:

for i in *.{h,cpp}
do
if [[ $i!="$pattern*" ]]
then mv $i $pattern$i
fi
done

4 个答案:

答案 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)。