我已經有了一個足夠簡單的問題,但沒有指導還有通過論壇或bash。問題如下:bash文件名開頭匹配
我想在與* .h或* .cpp匹配的目錄中的每個文件名中添加前綴字符串。但是,如果前綴已經應用到文件名,請不要再應用它。
爲什麼下面不工作是什麼,還有待想通了:
for i in *.{h,cpp}
do
if [[ $i!="$pattern*" ]]
then mv $i $pattern$i
fi
done
我已經有了一個足夠簡單的問題,但沒有指導還有通過論壇或bash。問題如下:bash文件名開頭匹配
我想在與* .h或* .cpp匹配的目錄中的每個文件名中添加前綴字符串。但是,如果前綴已經應用到文件名,請不要再應用它。
爲什麼下面不工作是什麼,還有待想通了:
for i in *.{h,cpp}
do
if [[ $i!="$pattern*" ]]
then mv $i $pattern$i
fi
done
你可以試試這個:
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
for i in *.{h,cpp}; do
[ ${i#prefix} = $i ] && mv $i prefix$i
done
不完全符合你的劇本,但它應該工作。如果沒有前綴,該檢查返回true(即,如果$ i,前綴「前綴」被移除,等於$ i)。
#!/bin/sh
pattern=testpattern_
for i in *.h *.cpp; do
case "$i" in
$pattern*)
continue;;
*)
mv "$i" "$pattern$i";;
esac
done
這個腳本會在任何Posix的shell中運行,而不是僅僅是bash。 (我不確定你的問題是「爲什麼這不工作」或「我該如何做這項工作」,所以我猜想它是第二個。)
其他人已經顯示替換比較的工作;我會刺探爲什麼原始版本沒有。原始前綴測試存在兩個問題:比較運算符(!=
)與其操作數之間需要有空格,而星號用引號引起(意思是字面匹配,而不是通配符)。修復這些問題,並且(至少在我的測試中)它按預期工作:
if [[ $i != "$pattern"* ]]
是的,這樣做會起作用 - 雖然它有在shell中顯示grep輸出的副作用,stdin) - 將需要關閉 – Display 2010-09-19 18:11:53
@Display; grep -q會爲你做到這一點。儘管這是一個相當耗費資源的解決方案。謝天謝地,回聲是一種內置的,所以它會減少一些時間。直接檢查字符串將是更可取的。 – falstro 2010-09-19 18:14:08
是的。我寧願不使用回聲。 – Display 2010-09-19 18:15:43