sed や xargs などを駆使し、apps/templates/foo.tpl, apps/actions/foo.php, apps/actions/config/foo.yml など各ディレクトリの foo.* を、 apps/templates/bar.tpl, apps/actions/bar.php, apps/actions/config/bar.yml のように bar.* に一括で置換したいです。どのようなコマンドを記述したらよいでしょうか?


当方の環境は Mac OS X Leopard です。

回答の条件
  • 1人2回まで
  • 登録:2008/09/24 13:57:31
  • 終了:2008/10/01 14:00:02

回答(2件)

id:y-kawaz No.1

y-kawaz回答回数1419ベストアンサー獲得回数2252008/09/24 14:23:15

ポイント35pt

こんなんでどうでしょうか?

find -type f -name foo.* | while read f; do mv "$f" "${f%/*}/bar${f##*/foo}"; done
  1. foo.で始まるファイルをfindで探す
  2. while read f で変数 f にファイル名が入る
  3. 適当に mv する
    • ${f%/*} は変数 f の後ろから /* にマッチする最小部分を削除する(ファイル名を削除してディレクトリ部分を残す)
    • ${f##*/foo} は変数 f の前から */foo にマッチする最大部分を削除する(ディレクトリ部分+/fooまでを削除してfooより後ろのファイル名部分を残す)

bashの変数展開色々については以下などを参照して納得してください

http://www.kawaz.jp/pukiwiki/?bash#v46ef504

id:poch-7003 No.2

poch-7003回答回数43ベストアンサー獲得回数82008/09/24 19:55:14

ポイント35pt

renameコマンドがあればこんな感じでしょうか.

find apps/ -type f -name foo.* |xargs rename foo. bar.
  • id:y-kawaz
    上の回答の補足です。find の引数が foo.* だとカレントディレクトリに foo.* なファイルがあった場合に意図しない展開をされてしまう恐れがあるので 'foo.*' とした方がよいです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません