2010-09-19 54 views
2

我已經有了一個足夠簡單的問題,但沒有指導還有通過論壇或bash。問題如下:bash文件名開頭匹配

我想在與* .h或* .cpp匹配的目錄中的每個文件名中添加前綴字符串。但是,如果前綴已經應用到文件名,請不要再應用它。

爲什麼下面不工作是什麼,還有待想通了:

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

回答

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 
+0

是的,這樣做會起作用 - 雖然它有在shell中顯示grep輸出的副作用,stdin) - 將需要關閉 – Display 2010-09-19 18:11:53

+0

@Display; grep -q會爲你做到這一點。儘管這是一個相當耗費資源的解決方案。謝天謝地,回聲是一種內置的,所以它會減少一些時間。直接檢查字符串將是更可取的。 – falstro 2010-09-19 18:14:08

+0

是的。我寧願不使用回聲。 – Display 2010-09-19 18:15:43

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

不完全符合你的劇本,但它應該工作。如果沒有前綴,該檢查返回true(即,如果$ i,前綴「前綴」被移除,等於$ i)。

+0

$ {i#prefix}應該是$ {i#$ prefix}。 但是其他工作。謝謝。 – Display 2010-09-19 18:10:08

+0

@Display;不,它應該是$ pattern,但我指的是字面前綴。 – falstro 2010-09-19 18:12:53

+0

上面使用'前綴'兩個地方的$模式,是的。 – Display 2010-09-19 18:17:44

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。 (我不確定你的問題是「爲什麼這不工作」或「我該如何做這項工作」,所以我猜想它是第二個。)

2

其他人已經顯示替換比較的工作;我會刺探爲什麼原始版本沒有。原始前綴測試存在兩個問題:比較運算符(!=)與其操作數之間需要有空格,而星號用引號引起(意思是字面匹配,而不是通配符)。修復這些問題,並且(至少在我的測試中)它按預期工作:

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