• ベストアンサー

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

  • Win10で「Shell:」コマンドでエラーが出る

    ■質問 Win10の「Shell:」コマンドで開ける特殊フォルダ等が突然開けなくなってしまいました。 「ファイル名を指定して実行」 で 「Shell:sendto」と入力すると、以下ののダイアログメッセージが出てしまいます。 「 'shell:sendto' が見つかりません。名前を正しく入力したかどうかを確認してから、やり直してください。 」 ■「Shell:」コマンドでできること 「ファイル名を指定して実行」 で 「shell:xxxxx」 と入力すると特殊フォルダを開く事ができます。 ・shell:sendto --> 右クリックの送る ・shell:startup --> スタートアップフォルダ ・Shell: コマンドで開けるフォルダ一覧 https://www.hiskip.com/technique/microsoft/windows/win10/2221.html ■ 変化のタイミング 最近はアプリのインストールなどはしておらず、数日中でで1回は使用するコマンドです。 今日使用したら上記のメッセージで使用できなくなっていました。 よろしくお願いします。

  • バックアップ用バッチファイルの作成方法

    作業用フォルダを日次でバックアップを取るバッチファイルを作成し、それをスケジューラーに登録して自動でバックアップを取れるようにしようと思っています。 下記のようなルールでバッチファイルを作成しようと考えていますが、バッチファイルの作成に詳しい方がいらっしゃったら教えていただけないでしょうか? --- (1)バックアップ作成時は、指定のフォルダをZIP形式で圧縮してバックアップをとる (2)サブフォルダ内のOLDフォルダ内のファイルはバックアップ対象外 (3)ファイル名はYYYYMMDD.zipとして保存 現在、winzipというZIP用のアプリケーションを使用しており、wzzipというコマンドでコマンドライン上から圧縮が可能なので、それを使用したいと思っています。 一旦OLDフォルダを除いたものをテンポラリフォルダに入れて、それを圧縮(環境変数か何かから日付を持ってきて、ファイル名を指定して)するのがいいのかなとは考えているのですが、実際のコマンドの書き方がわかりません。 ご存知の方がいらっしゃいましたら、よろしくお願い致します。

  • フォルダの中身を「ファイル名.拡張子.txt」で書き出し

    フォルダの中にある複数のファイルをそれぞれ「ファイル名(拡張子付き).txt」のように書き出し出来ないものでしょうか? 例えば、フォルダの中にaaaa.zipやaaaa.aviといったファイルがあるとします。それらをなんらかの方法で元のファイルは残したまま任意の場所へaaaa.zip.txt、aaaa.avi.txtといった具合に書き出ししたいのです。もちろん名前だけのtxtファイルなので容量は0バイトです。なにかいい方法あったら教えてください。

  • macのターミナルで、ファイル名を一括変更したいです。

    macのターミナルで、ファイル名を一括変更したいです。 windowsでいえば、 ren *.gif [風景]*.gif というコマンドをコマンドプロントでうつと、移動したディレクトリ先のファイル名が一括で変更されるとおもいます。 しかし、macでmvで同様のことをするとエラーが出ます。おそらくwindowsとか勝手が違うということはわかるのですが、できれば、macのターミナルでも同様のことができるようにしたいので、そのようなコマンドがあれば教えてください。

    • ベストアンサー
    • Mac
  • バッチファイルについて

    こんにちは。 今回はバッチファイルについてよろしくお願いいたします。まったくの初心者なので記述例などあるととても嬉しいです。 例えば C:\ABCフォルダに毎日AAAA/BB/CCのファイルが作成されます。 これを毎月1日に前月の分(AAAA/BB/01~AAAA/BB/31など)を別ドライブにAAAA.BBというフォルダを作成した上で、その中に放り混むようなものは作成可能なのでしょうか? 毎月1日に、前月分のファイルをまとめて他のドライブに新規作成したフォルダへ移動する、というイメージです。 お分かりになる方、よろしくお願いいたします。

  • unzipで日本語ファイル名が文字化けする

    Windows上で作成した「テスト1.txt」、「テスト2.txt」というファイルを圧縮したsample.zipがあります。これをlinux上でunzipで解凍したところファイル名が文字化けしました。検索すると「-O」オプションで文字コードを指定するとよいとのことでしたが手元のlinux OSのunzipには「-O」オプションは存在しないようでした。 https://qiita.com/toyoshim/items/be4613fa373b4847196f そこで上記ページの記述にあるように 「iconv -f shift-jis -t utf-8を通したリネーム」 というのをやろうと思い 「unzip sample.zip | iconv -f CP932 -t utf-8」 とコマンドを打ってみましたが文字化けしてしまいました。 何かコマンドの使い方間違っていますでしょうか?

  • shell_execコマンドについて

    PHP上でshell_execコマンドを使用し下記のようにディレクトリをコピーするコマンドを実行したのですが「000_copy」のフォルダは作成されませんでした。 コピー元のディレクトリの所有者はrootで権限も全て読み込み、書き込み、実行権限可能としてあります。 宜しくお願いします。 cp -a /home/samba/000_テンプレート /home/samba/000_copy

    • ベストアンサー
    • PHP
  • コマンドでのファイル解凍

    コマンドプロンプトを利用した、コマンドラインの操作で、 "複数のZIPファイルを選択し、各中身のファイルを指定したフォルダに解凍" をしたいのですが、 >unzip [命令・オプション] [圧縮ファイル(.zip)] [解凍先(\)] までしかわかりません。しかもこれでは複数のZIPファイルの解凍ができないみたいです。 レスポンスファイルを使用するのでしょうか? ネットを検索してもわかりません。 方法をご存知の方、よろしくお願いします。

  • sourceforgeのshellサーバについて。

    現在、sourceforgeの自分のアカウントのshellサーバー内にログインして、自プロジェクトのリポジトリのダウンロードを行おうと思っているのですが、暗号鍵の作成などを完了して、puttyjp.exeでログインして @sf-usr-shell:~$ ls と行って、ディレクトリ内を閲覧しようと思ったのですが、何も入っていないようで何もフォルダやファイル名が表示されません。 自プロジェクトのリポジトリ等のpassはどこになりますでしょうか? ぜひご教授よろしくお願い致します。

  • 【UNIX】unzip がcron で作動しない

    さくらインターネットのCRON機能で cd (対象ディレクトリ); /usr/local/bin/php -f (phpの名前)コマンドで PHPを自動的に実行しています。 その PHPには system("cd /zipファイルのあるパス/; unzip -Z hoge.zip"); というコマンドが実行されるようになっています。 (本来は、zipの解凍をしたいのですがテスト的にまず、ファイルの内容を表示) このphpを直接ブラウザ上で実行する場合は、うまく動くのですが CRON上で動かした場合は、unzip: not found というエラーが帰ってきます。 また、CRONのコマンド実行フォームにphp実行コマンドではなく、直接 "cd /zipファイルのあるパス/; unzip -Z hoge.zip" を実行しても unzip: not found が出てきてしまいます。 /home/[ユーザー名]/www/・・・と 絶対パスを指定しているので、パスは合っているかと思います。 unzip コマンドを実行するには予め何かを実行しないといけないのでしょうか? 何故、unzip: not found が出てしまうのか アドバイスよろしくお願いいたします。 サーバーOSバージョン FreeBSD 7.1-RELEASE-p16 i386