• ベストアンサー

ディレクトリ内のファイル名の一括変更できませんか?

同じディレクトリにある test-sum.txt test-average.txt test-deviation.txt ... というファイルの名前を my-sum.dat my-average.dat my-deviation.dat ... と一括変更したいのですが、bash で可能でしょうか? よろしくお願いします!! ワイルドカード * の扱いが Windows のコマンドプロンプトと違うみたいで、とまどっています。。

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

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.4

sed版も再帰dirに対応 find . -name '*.txt' -print | sed -ne 's/\([^/]*\)\/test-\([^.]*\)\.txt/mv \1\/test-\2.txt \1\/my-\2.dat/p' | sh

white-tiger
質問者

お礼

ありがとうございます!

その他の回答 (4)

  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.5

windows の場合、* は各コマンドが個別に独自の意味を持って処理しますが、unixのshellの場合は、各コマンドを起動する前にshellが展開します。 shellでワイルドカードを使う場合は、まず実際のコマンドでなく、echo コマンドを使うと、実際に実行されるコマンドラインがわかるでしょう。 例:echo mv test-*.txt my-*.txt 本題ですが、bashの場合、sedやawkを使わないでも出来ます。 for F in test-*.txt;do mv $F ${F/test-/my-};done

white-tiger
質問者

お礼

へえ、そういうことができたのですね。ありがとうございます!

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.3

済みません間違えました。 find . -name '*.txt' -print | sed -ne 's/.\/test-\([^.]*\)\.txt/mv test-\1.txt my-\1.dat/p' | sh

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

find . -name '*.txt' -print | sed -ne 's/test-\([^.]*\)\.txt/mv test-\1.txt my-\1.dat/p' | sh

  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.1

find . -name '*.txt' -print | awk ' { dist = $0; sub("test-","my-",dist); sub("txt","dat",dist); printf ("mv %s %s\n", $0, dist); }' | sh

関連するQ&A

  • linuxコマンド/複数のディレクトリに対して一括でファイルをコピー

    linuxコマンドについて質問です。 ある特定の1つのファイルを、複数のディレクトリに対して一括コピーはできなのでしょうか? root La Lb Lc -test.txt ↓実行後 root La-test.txt Lb-test.txt Lc-test.txt -test.txt root以下にあるファイル test.txt(root/test.txt)を root以下にあるディレクトリa,b,cにコピーしたいのです。 よろしくお願いいたします

  • コマンドプロンプトによるファイル名一括変換

    コマンドプロンプトで、サブディレクトリを含めたファイル名の一括変換 をしたいのですが、次のコマンドを叩いたら、「コマンドの構文が間違っています」と出てしまいました。どこがおかしいのでしょうか? カレントディレクトリの中の「*.txt」ファイルをすべて「*.doc」にしたい場合↓ for /r /d %i in (*) do ren %i\*.txt *.doc よろしくお願いします。

  • 多数のサブディレクトリ内のファイルを一括コピーする

    コマンドプロンプトについて初心者ですがよろしくお願いします。 多数のサブディレクトリとフォルダ名もバラバに異なる中から特定のファイル(.txt)のみを全てを一括しコピーしたいのですがバッチファイルを使用した方法を教えてください。 (コピー元 C:)             (コピー先F:) \AA ∟\aa ∟aa.txt                aa.txt \BB ∟\bb ∟bb.txt        ⇒       bb.txt \CC ∟\cc   ∟ cc.txt               cc.txt

  • コマンドプロンプトでファイル名一括変更

    コマンドプロンプトのrenコマンドでフォルダ内の同一拡張子のファイル名の拡張子を一括変更することはできますが、 (例 ren *.txt *.htm ) 拡張子以外の共通部分を拡張子を含む形で一括変更することはできませんか? たとえば拡張子のないd01という文字列で終わるファイル名を一括してd01の部分を消して拡張子を.jpgにしたいのです。

  • 一括でファイル名の一部を置換したい

    LinuxのFedora Core 10, シェルにtcshを使用しています。よろしくお願いします。 ======================================================================= 複数のディレクトリ内に、"(from home)"のような文字列を含むファイルがあり、 それらのファイル名から一括で"(from home)"という文字列を取り除きたいのですが ======================================================================= 例えば以下のように、2つのディレクトリ(Directory1,Directory2)の下に、 "(from home)"という文字列を含むファイルが2つずつある場合を考えて、 /Directory1/sample (from home).txt         sample2 (from home).txt /Directory2/ sample3 (from home).txt          sample4 (from home).txt > rename "(from home)" "" `find / -name "(from home)" -print` を試したのですが上手くいかず、 > foreach i (`find / -name "(from home)" print`) foreach? rename "(from home)" "" $i foreach? end でも上手くいきませんでした。 もしかしたらfindコマンドで見つけたファイル名をrenameコマンドに 上手く渡せていないのかと思うのですが、どのようにすれば良いのでしょうか? また別の方法でも、一括でファイル名の一部を変更する方法があれば、 ご教授お願い致します。

  • cygwin で "bash --login -i"するとホームディレクトリに移動してしまう

    cygwin で startx から X-Window を使いたいと思っています。 私は cygwin.bat を使わずに、コマンドプロンプトから直接 bash とタイプしています。(エクスプローラから好きなディレクトリでコマンドプロンプトを開くことができるようにしてあります) (1) コマンドプロンプトから bash とタイプとすると、startx とタイプしても反応がありません。 (2) bash --login -i とタイプすると、startx はできるのですが、ディレクトリが勝手に cygwin のホームディレクトリに移動してしまいます。 ディレクトリを移動せずに cygwin を起動して xwindow を使う方法はないでしょうか?

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

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

    • ベストアンサー
    • Mac
  • コマンドプロンプトでファイル名変更

    コマンドプロンプトを使って C:\test.txt というファイルを今日の日付、例えば2005年3月25日だったら、 C:\20050325.txt に名前を変更するにはどのように記述したらよいでしょうか?

  • MS-DOSでのファイル/フォルダ一括削除

    以下のようなフォルダ、ファイルがあるとし、LOGDIR下にある「200803」の文字列を 含まないファイル及びフォルダをDOSコマンド(Win2003)で削除(できれば一括で) する方法を模索しています。 Cドライブ   |   |   +LOGDIR      |      +---LOG20080228_084539    <--- 削除対象ディレクトリ      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080229_101553    <--- 削除対象ディレクトリ      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080301_132059    <--- 削除対象ディレクトリでない      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      +---LOG20080302_185945    <--- 削除対象ディレクトリでない      |     |      |     +-------log1.txt      |     |      |     +-------log2.txt      |      |-----test20080229_085523.txt    <--- 削除対象ファイル      |      |-----test20080229_092310.txt    <--- 削除対象ファイル      |      |-----test20080301_153859.txt    <--- 削除対象ファイルでない      | 方法をご存知の方、いらっしゃいませんか?

  • MSDOSからワイルドカード指定で複数ファイル名の一部を一括変更

    MSDOSからワイルドカード指定で複数ファイル名の一部を一括変更する方法はありますでしょうか? 例えば、 「a.dat.gz」「b.dat.gz」「c.dat.gz」 上記のような複数ファイルを以下のように変更したいと思っています。 「a.gz」「b.gz」「c.gz」 ちなみに次のコマンドを試してみたのですがダメでした。 ren *.dat.gz *.gz 実際はバッチファイルから処理をさせたいと思っています。 よろしくお願いいたします。