- ベストアンサー
ディレクトリ内のファイル名の一括変更できませんか?
同じディレクトリにある test-sum.txt test-average.txt test-deviation.txt ... というファイルの名前を my-sum.dat my-average.dat my-deviation.dat ... と一括変更したいのですが、bash で可能でしょうか? よろしくお願いします!! ワイルドカード * の扱いが Windows のコマンドプロンプトと違うみたいで、とまどっています。。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
sed版も再帰dirに対応 find . -name '*.txt' -print | sed -ne 's/\([^/]*\)\/test-\([^.]*\)\.txt/mv \1\/test-\2.txt \1\/my-\2.dat/p' | sh
その他の回答 (4)
- notnot
- ベストアンサー率47% (4900/10359)
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
お礼
へえ、そういうことができたのですね。ありがとうございます!
- mac_res
- ベストアンサー率36% (568/1571)
済みません間違えました。 find . -name '*.txt' -print | sed -ne 's/.\/test-\([^.]*\)\.txt/mv test-\1.txt my-\1.dat/p' | sh
- mac_res
- ベストアンサー率36% (568/1571)
find . -name '*.txt' -print | sed -ne 's/test-\([^.]*\)\.txt/mv test-\1.txt my-\1.dat/p' | sh
- mac_res
- ベストアンサー率36% (568/1571)
find . -name '*.txt' -print | awk ' { dist = $0; sub("test-","my-",dist); sub("txt","dat",dist); printf ("mv %s %s\n", $0, dist); }' | sh
お礼
ありがとうございます!