ファイル名の一部をまとめて変更する(その2)

ファイル名をまとめて変更したい場合,前に書いたような方法が使えますが,もう少し手の込んだことをしたい場合もでてきます。

やりたいことによってやりようもいろいろなのでしょうけれども,

ARI_TNT_H01_phy_org.dat

という形のファイル名で,最後のorgという部分がファイル名の中に共通に入っていて,それを取り除いて

ARI_TNT_H01_phy.dat

と云う具合に変えたい,というのが目標です。

% echo 'ARI_TNT_H01_phy_org.dat' | cut -d'_' -f1-4
ARI_TNT_H01_phy

と返ってくるのでcutコマンドが使えそうです。%はcshのプロンプトです。-dはデリミター(区切り文字)の指定,-fは区切られた文字列のどこを選ぶか,というオプションです。1-4と指定すると一つ目から4つ目までを選びます。

これを使えば,foreachと組み合わせてなんとかなりそうです。%はcshのプロンプト,foreach?はforeachのプロンプトです。

% ls
ARI_TNT_H01_phy_org.dat
NNA_TNT_H01_phy_org.dat
OKG_TNT_H01_phy_org.dat
OKR_TNT_H01_phy_org.dat
TRY_TNT_H01_phy_org.dat
%
% foreach I (*phy.dat)
foreach? echo $I
foreach? set j = `echo $i | cut -d'_' -f1-4`
foreach? echo ${j}.dat
foreach? mv $I ${j}.dat
foreach? end
ARI_TNT_H01_phy_org.dat
ARI_TNT_H01_phy.dat
NNA_TNT_H01_phy_org.dat
NNA_TNT_H01_phy.dat
OKG_TNT_H01_phy_org.dat
OKG_TNT_H01_phy.dat
OKR_TNT_H01_phy_org.dat
OKR_TNT_H01_phy.dat
TRY_TNT_H01_phy_org.dat
TRY_TNT_H01_phy.dat
%
% ls
ARI_TNT_H01_phy.dat
NNA_TNT_H01_phy.dat
OKG_TNT_H01_phy.dat
OKR_TNT_H01_phy.dat
TRY_TNT_H01_phy.dat
%
という具合になります。${j}.datとしているのはカッコで変数をくくらないとどこまでが変数名なのか,シェルがわからないからです。また,バッククオーテーションを使ってコマンドの出力を変数jに代入しています。

これはいろいろなコマンドを使う時に応用できそうです。

miniSEEDフォーマットのデータをasciiに変換

最近使ったデータロガーのデータフォーマットがminiSEEDになっていると云うことでしたのでこれをテキストに変換する方法を教えてもらいました。

たんにmseed2asciiというフォーマット変換のコードをフォーマットの開発元からもらってきてコンパイルすればよさそうです。

IRIS (Incorporated Research Institutions for Seismology)が提供しているmseed2asciiソースをgithubからもらってきます。ダウンロードはここからできます。これを書いている時の最新版はv2.6です。

zipかtar.gzのソースをダウンロードして適当なところで展開してmakeするだけです。FreeBSDの場合はOS標準のmakeではうまくコンパイルできないのでgmakeでmakeします。

cd (somehere)/
tar zxvf mseed2ascii-2.6.tar.gz
cd mseed2ascii-2.6
gmake

これだけです。カレントディレクトリにmseed2asciiという実行可能ファイルが出来上がっています。

使い方はマニュアルを参照します。

(somewhere)/mseed2ascii -f 2 hoge.seed

という具合にminiSEEDファイルのファイル名(hoge.seed)を指定すればOKです。オプションの-f 2はデータごとに時刻を出力するオプションです。何もつけなければファイルの頭のデータの時刻がヘッダとして出力されてあとはデジタイズされた整数値だけが出力されます。

そんだけ...。簡単です。

ファイル名の一部をまとめて変更する

たくさんのファイルがあって,ファイル名の一部だけを系統的に変えたい場合があります。その場合,cshではforeachを使えばよいのですが,拡張子を取り除いたファイル名を使ってファイル名を加工すると便利です。

cshの変数に代入されているファイル名から一部を取り出すには,修飾子を使います。

:r 拡張子を取り除く
:h パス名を取り出す
:e 拡張子を取り出す
:t ファイル名と拡張子を取り出す。

例えば拡張子を取り除くならば以下のようにします。

set name = hoge_fuga.txt
echo $name:r

このときの出力はhoge_fugaです。

ファイル名を一括で変更するためには以下のようにします。%はcshのプロンプト,foreach?はforeachのプロンプトです。

% ls
ARI_TNT_H01_phy.dat
NNA_TNT_H01_phy.dat
OKG_TNT_H01_phy.dat
OKR_TNT_H01_phy.dat
TRY_TNT_H01_phy.dat
%
% foreach I (*phy.dat)
foreach? echo $I
foreach? mv $I $I:r_org.dat
foreach? end
ARI_TNT_H01_phy.dat
NNA_TNT_H01_phy.dat
OKG_TNT_H01_phy.dat
OKR_TNT_H01_phy.dat
TRY_TNT_H01_phy.dat
%
% ls
ARI_TNT_H01_phy_org.dat
NNA_TNT_H01_phy_org.dat
OKG_TNT_H01_phy_org.dat
OKR_TNT_H01_phy_org.dat
TRY_TNT_H01_phy_org.dat
%

という感じです。