开发者

bash filename start matching

I've got a simple enough question, but no guidance yet through the forums or bash. The question is as follows:

I want to add a p开发者_运维知识库refix string to each filename in a directory that matches *.h or *.cpp. HOWEVER, if the prefix has already been applied to the filename, do NOT apply it again.

Why the following doesn't work is something that has yet to be figured out:

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


you can try this:

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


Others have shown replacements comparisons that work; I'll take a stab at why the original version didn't. There are two problems with the original prefix test: you need spaces between the comparison operator (!=) and its operands, and the asterisk was in quotes (meaning it gets matched literally, rather than as a wildcard). Fix these, and (at least in my tests) it works as expected:

if [[ $i != "$pattern"* ]]


#!/bin/sh
pattern=testpattern_
for i in *.h *.cpp; do
  case "$i" in
     $pattern*)
        continue;;
      *)
        mv "$i" "$pattern$i";;
  esac
done

This script will run in any Posix shell, not just bash. (I wasn't sure if your question was "why isn't this working" or "how do I make this work" so I guessed it was the second.)


for i in *.{h,cpp}; do
  [ ${i#prefix} = $i ] && mv $i prefix$i
done

Not exactly conforming to your script, but it should work. The check returns true if there is no prefix (i.e. if $i, with the prefix "prefix" removed, equals $i).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜