• ベストアンサー

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

同じディレクトリにある 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% (4900/10358)
回答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