• ベストアンサー

Shellでファイル名を抜き出して変更

お疲れ様です。 いつもお世話になっています。 よろしくお願いします。 現在Shellで、下記の流れのプログラムを制作しています。 ------ 1.zipを一時ディレクトリに展開(unzip) 2.もとのzip名(aaaa-bbcccc-dddd-YYYYMMDD.zip)からXXXXX-bb-YYYYMMDDというフォルダを作成 3.一時ディレクトリのファイルをmv ------ ごく簡単なものだとは思うのですが、2.のフォルダを作成のところで悩んでいます。 cutコマンドが近い気がするのですが、これはファイルの中身を抜き出すコマンドのようで、うまく使えません。 フォルダ名の一部分を抜き出して、新しいフォルダ名としてつくるにはどうすればよいのでしょうか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#1です。 勘違いしましたw sedで...と思ったら#2の方の回答があるので,せっかくだからawkで :-) # awkじゃなくnawkでないとsubが使えない処理系もあり。 --- ここから #!/bin/sh for fileName in *.zip do dirName=`echo ${fileName%.zip} | awk ' BEGIN { FS = "-" } { sub(/....$/, "", $2) print "XXXXX-" $2 "-" $4 }'` mkdir ${dirName} done --- ここまで

その他の回答 (2)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

aaaa-bbcccc-dddd-YYYYMMDD.zip における aaaa, cccc, dddd にもよるんだけど ・使うシェル変数を増やす ・あきらめて sed は思い付くなぁ. 前者でいくなら, bb の部分を覚えておく変数と最後の YYYYMMDD の部分を覚えておく変数を作って最後に合体させる. 後者でいくなら mv 一時ディレクトリ `echo $fileName | sed -e 's/^[^-]*-\(..\)[^-]*-[^-]*-\(.*\)\.zip/\1\2/'` のような感じ. sed の正規表現があってるかどうかはしらん (けど \(~\) じゃなくて (~) にするくらいのはず).

回答No.1

2.に関しては ---- ここから #!/bin/sh for fileName in *.zip do mkdir ${fileName%.zip} done ---- ここまで みたいなやり方では駄目ですか?

nyalio
質問者

補足

回答ありがとうございます。 .zipを落とすだけでなく、最初のaaaaをXXXXにかえたいのです。 なので、困っていました。

関連するQ&A

専門家に質問してみよう