質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

3396閲覧

CentOSで、指定ディレクトリ以下の「ディレクトリ名」と「ファイル名」と「ファイル内容」をグレップ置換

re97

総合スコア208

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

UNIX

UNIXとは、AT&Tのベル研究所で開発されたコンピューター用のマルチユーザー・マルチタスクのオペレーションシステム(OS)です。政府や教育機関や研究所で広範囲に採用されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2016/04/24 12:05

「hogeディレクリ」以下の「hoge.com」を全て「piyo.net」へ変更したいです

対象
・ディレクトリ名
・ファイル名
・ファイル内容



・「teratail.hoge.comディクトリ」→「teratail.piyo.netディクトリ」
・「test.hoge.com2016ディクトリ」→「test.piyo.net2016ディクトリ」
・「teratail.hoge.comファイル」→「teratail.piyo.netファイル」
・「test.hoge.com2016ファイル」→「test.piyo.net2016ファイル」
・aファイル内容「分からないhoge.com全然」→aファイル内容「分からないtest.piyo.net全然」


質問
・どうやって書けば良いでしょうか?
・「ディレクトリ名」と「ファイル名」は、renameでしか出来ない(?)から1回での変更は無理?


現状案
・怖いのでまだ試していません

$ find /var/www/hoge/ -type d -exec sed -i 's/hoge.com/piyo.net/g'
$ find /var/www/hoge/ -type f -exec sed -i 's/hoge.com/piyo.net/g'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2016/04/24 12:40

bash等の縛りはありますか?ファイル内容まで書き換えるとなると結構複雑になるため、PythonやRubyあたりで作った方がいいかなと思っています。 あと、今あるのを書き換えずに、別のディレクトリに複製で作るというのはありでしょうか?
re97

2016/04/24 12:51 編集

>bash等の縛りはありますか? ・bash希望です ・もしくはPHP ・PythonやRubyは全く分からないので… >今あるのを書き換えずに、別のディレクトリに複製で作るというのはありでしょうか? ・ありです ・すでにディレクトリ自体はコピーしていて、それに対して処理する予定です
guest

回答2

0

ベストアンサー

ディレクトリのリネーム

ディレクトリの上の階層からもしくは下の階層から順番に実行する必要がありそうです。
最大99階層とすると、

Bash

1for((i=1;i<100;i++)) 2do find /var/www/hoge -mindepth $i -maxdepth $i -type d -name "*hoge.com*" -print0 | 3 xargs -0 rename hoge.com piyo.net 4done 5```階層数をスクリプト中で数えることも出来ますが、実用的にはこれでいいかと。 6 71つのディレクトリ名にhoge.comが2つ以上含まれる事があるのなら面倒。 8```Bash 9for((i=1;i<100;i++)) 10do find /var/www/hoge -mindepth $i -maxdepth $i -type d -name "*hoge.com*" -print0 | 11 xargs -0 -i env "DIR={}" sh -c 'mv "$DIR" "${DIR//hoge.com/piyo.net}"' 12done

#ファイルのリネーム

Bash

1find /var/www/hoge -type f -name "*hoge.com*" -print0 | 2xargs -0 rename hoge.com piyo.net

同じく、複数回出てくる可能性があるなら、

Bash

1find /var/www/hoge -type f -name "*hoge.com*" -print0 | 2xargs -0 -i env "FILE={}" sh -c 'mv "$FILE" "${FILE//hoge.com/piyo.net}"'

#中身の置換

Bash

1find /var/www/hoge -type f -print0 | 2xargs -0 sed -i 's/hoge\.com/piyo\.net/g'

・怖いのでまだ試していません

対象ディレクトリの外にバックアップしておけば良いかと。

追記:
hoge.comを含むファイルだけ置換対象にするなら、

Bash

1find /var/www/hoge -type f -print0 | 2grep -l --null 'hoge\.com' | 3xargs -0 sed -i 's/hoge\.com/piyo\.net/g'

投稿2016/04/24 12:57

編集2016/04/24 13:03
otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

re97

2016/04/24 14:16

・回答ありがとうございました ・期待通り動作しました! >-print0 ・初めて知りました ・こういうオプションがあるのですね >1つのディレクトリ名にhoge.comが2つ以上含まれる事があるのなら面倒 ・今回は該当しなかったですが、場合によってはそういう可能性も考慮しなければいけないなと思いました ・そういう発想は全くなかったので、配慮というか視点が凄いなと思いました ・大変参考になりました
guest

0

ファイルとディレクトリのリネームはこんな感じで
(テストしてないので間違ってたらごめん)

shell

1#!/bin/sh 2find /var/www/hoge/ -name '*hoge.com*' -print | \ 3while read f 4do 5 mv $f `echo $f | tr 'hoge.com' 'piyo.net'` 6# ためすなら以下のように 7# echo mv $f `echo $f | tr 'hoge.com' 'piyo.net'` 8done

ファイル内容は sed でいけますよね。

投稿2016/04/24 12:26

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

re97

2016/04/24 12:53

・回答ありがとうございました >ファイルとディレクトリのリネームはこんな感じで ・やっぱり分けて処理するのですね ・まとめて出来るかどうかすら分からなかったので、参考になりました
takasima20

2016/04/24 13:09

いや、内容を変更するファイルを特定する条件が分からないので 書いてないですけど、分かるなら同時でもいいんじゃないですか?
re97

2016/04/24 14:11

コメントありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問