プロが教えるわが家の防犯対策術!

現在、ubuntu/linuxを使用しています。
あるディレクトリ以下のファイル名と内容を全て出力するシェルスクリプトを作りたいです。例えば、
/home/web/以下aa.phpとbb.phpとcc.phpのファイルがあるとします。(実際は、20ファイル程度あります)
これをall.txtに
aa.php←ファイル名
・・・←aa.phpの内容
bb.php←ファイル名
・・・←bb.phpの内容
cc.php←ファイル名
・・・←cc.phpの内容

とファイル名とファイルの内容を順次結合させるにはどういうシェルスクリプトを作成すればよろしいでしょうか?できれば、for文などで動的に繰り返し制御を行えたら一番うれしいです。今までは、lsやcat文で一行づつ記述していましたが、さすがにファイル数が増えると面倒になりました。

追伸 何がやりたいかというと自分のサイトのソースを全部1ファイルにまとめて、pdfや印刷をしたいです。欲をいうとサブディレクトリまで検索して結合できると一番うれしいのですが・・・(まだディレクトリ数は少ないのでなんとかなります)

A 回答 (7件)

#! /bin/sh


#
WORKDIR="/home/web"

cd $WORKDIR
find . -type f -name "*.php" -print | while read file ; do
echo "=== $file ==="
cat $file
done

※ .phpだけではなく全ファイルという事なら『-name "*.php"』を削れば良いし、php もPhpもPHPもという事なら-nameの変わりに-inameを使えば良い。

> サブディレクトリまで検索して結合できると一番うれしいのですが

できますよ。ディレクトリの階層を限定する場合にはfindコマンドの-d(-depth)オプションを指定すれば良いです。

『find . -type d -print 』でディレクトリを表示できますので、ディレクトリ一覧をみて対象にする階層の深さを考えても良いです。
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。私のやりたいことそのままです。

お礼日時:2011/06/03 22:19

少し形式は異なりますが、簡単には、



cd /home/web
more *.php > all.txt

ファイル名の上下に ============= というのが入りますので、かえって見やすいのでは?

サブディレクトリが一階層なら、

cd /home/web
more *.php */*.php > all.txt
    • good
    • 0
この回答へのお礼

単純にmoreで出きるのですね。ラインが入るのは、見やすくて良いです。
ありがとうございます

お礼日時:2011/06/03 22:28

グルたちの不機嫌そうな顔が目に浮かぶので 2点修正。



1) サブディレクトリ対応
2) 余計なファイルをソースディレクトリに作らない。

cd /home/web/
find . -name '*.php' -print0 | xargs -0 pr -F -n > /tmp/$(date '+%y%m%d')-php_srcs4print.txt

コマンドマニュアル
http://linuxjm.sourceforge.jp/html/GNU_findutils …
http://linuxjm.sourceforge.jp/html/GNU_findutils …
    • good
    • 0
この回答へのお礼

確かに、ソースディレクトリに無い方が良いです。参考になりました。

お礼日時:2011/06/03 22:24

やっとコマンド名おもいだせた!


cd /home/web/
pr -F -n *\.php > all.txt

http://linuxjm.sourceforge.jp/html/GNU_textutils …

20年前にこんなにもたもた回答してたらグルたちの機嫌をそこねるところだったよ!
    • good
    • 0
この回答へのお礼

prでもできるのですね。ありがとうございます

お礼日時:2011/06/03 22:23

追加。



もっといろいろ細かい制御や、表示の変更をしたかったら、PHPを使うというのも手です。
php php-script.php
でphp-script.phpに書かれたスクリプトを実行できるはず。
    • good
    • 0
この回答へのお礼

このへんはもう少し勉強します

お礼日時:2011/06/03 22:21

PHPやってるのなら、考え方はわかると思いますが



・filenameと表示
echo "filename"

・ファイル filenameの内容を表示
cat filename

→filenameと表示してからファイル filenameの内容を表示
echo "filename" ; cat filename

→変数filenameを表示してから、変数filenameの名前のファイルの内容を表示
echo "${filename}" ; cat "${filename}"

→ *.phpに一致するファイルに対して(B-sh系)
for filename in *.php
do
echo "${filename}" ; cat "${filename}"
done

→ サブディレクトリに再帰的に辿るには、findを使うとよい。
find . -name "*.php" -type f -print -exec cat \{\} \;

for文については、man sh , man bash
findについては man find
も参考に。
    • good
    • 0
この回答へのお礼

丁寧な説明ありがとうございます。

お礼日時:2011/06/03 22:20

find とか echo とか cat とかを駆使すればいいんじゃなかろうか.

    • good
    • 0
この回答へのお礼

そのとおりなのですが、私の力量では力技になってしまって、スマートにやる知識がありませんでした。

お礼日時:2011/06/03 21:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!