5

このコマンドを使用して、renameファイルの名前をバッチで変更しています。今まで、私は次のようなファイルを持っていました:

2010.306.18.08.11.0000.BO.ADM..BHZ.SAC
2010.306.18.08.11.0000.BO.AMM..BHZ.SAC
2010.306.18.08.11.0000.BO.ASI..BHE.SAC
2010.306.18.08.11.0000.BO.ASI..BHZ.SAC

を使用してrename 2010.306.18.08.11.0000.BO. "" *rename .. _. *私はそれらを次のように減らしました:

ADM_.BHZ.SAC
AMM_.BHZ.SAC
ASI_.BHE.SAC
ASI_.BHZ.SAC

それはまさに私が欲しいものです。少し不器用だと思いますが、うまくいきます。次のようなファイルがあるため、問題が発生します。

2010.306.18.06.12.8195.TW.MASB..BHE.SAC
2010.306.18.06.14.7695.TW.CHGB..BHN.SAC
2010.306.18.06.24.4195.TW.NNSB..BHZ.SAC
2010.306.18.06.25.0695.TW.SSLB..BHZ.SAC

同じフォルダに存在します。コマンドでワイルドカードを使用して、上記と同様の結果を得ようとしていますrenamerename 2010.306.18.*.*.*.*. ""しかし、これにより、他のすべてのファイルの先頭に最初の外観が追加2010.306.18.*.*.*.*.されます。明らかに、私が求めているものではなく、次のようになります。

2010.306.18.06.12.8195.TW.MASB..BHE.SAC
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.14.7695.TW.CHGB..BHN.SAC
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.24.4195.TW.NNSB..BHZ.SAC
2010.306.18.06.12.8195.TW.MASB..BHE.SAC2010.306.18.06.25.0695.TW.SSLB..BHZ.SAC

私はここでワイルドカードのかなり基本的な原則を理解していないと思うので、誰かがこれが機能しない理由と、望ましい結果を得るために私ができることを説明できますか(できればを使用してrename)。


NB

明確にするために、出力は次のようになります。

ADM_.BHZ.SAC
AMM_.BHZ.SAC
ASI_.BHE.SAC
ASI_.BHZ.SAC
MASB.BHE.SAC
CHGB.BHN.SAC
NNSB.BHZ.SAC
SSLB.BHZ.SAC
4

2 に答える 2

17

最初にこれを試して、実行されるコマンドを確認できます

for f in *; do echo mv $f `echo $f | sed 's/2010.*.TW.//'` ; done

期待どおりの場合はecho、コマンドから削除して実行できます

for f in *; do mv $f `echo $f | sed 's/2010.*.TW.//'` ; done
于 2012-09-26T12:22:40.520 に答える
6

renamefromおよび文字列にワイルドカードを使用することはできませんto。実行rename 2010.306.18.*.*.*.*. "" *すると、最初にワイルドカードを展開し、展開の結果を に渡すのは実際にはシェルであるrenameため、機能しないのはなぜですか。

を使用する代わりにrename、次のようにループを使用します。

for file in *
do
  tmp="${file##2010*TW.}"   # remove the file prefix
  mv "$file" "${tmp/../_}"  # replace dots with underscore
done
于 2012-09-26T14:50:13.097 に答える