- ベストアンサー
シェルスクリプトでファイル一括出力する方法
- シェルスクリプトを使用して、特定ディレクトリ以下のファイル名と内容を一括出力する方法について解説します。
- lsコマンドやcatコマンドを使用せずに、for文を使って動的に繰り返し制御を行います。
- また、サブディレクトリまで検索して結合する方法についても触れます。
- みんなの回答 (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 』でディレクトリを表示できますので、ディレクトリ一覧をみて対象にする階層の深さを考えても良いです。
その他の回答 (6)
- notnot
- ベストアンサー率47% (4900/10358)
少し形式は異なりますが、簡単には、 cd /home/web more *.php > all.txt ファイル名の上下に ============= というのが入りますので、かえって見やすいのでは? サブディレクトリが一階層なら、 cd /home/web more *.php */*.php > all.txt
お礼
単純にmoreで出きるのですね。ラインが入るのは、見やすくて良いです。 ありがとうございます
- dscripty
- ベストアンサー率51% (166/325)
グルたちの不機嫌そうな顔が目に浮かぶので 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/man1/find.1.html http://linuxjm.sourceforge.jp/html/GNU_findutils/man1/xargs.1.html
お礼
確かに、ソースディレクトリに無い方が良いです。参考になりました。
- dscripty
- ベストアンサー率51% (166/325)
やっとコマンド名おもいだせた! cd /home/web/ pr -F -n *\.php > all.txt http://linuxjm.sourceforge.jp/html/GNU_textutils/man1/pr.1.html 20年前にこんなにもたもた回答してたらグルたちの機嫌をそこねるところだったよ!
お礼
prでもできるのですね。ありがとうございます
- kmee
- ベストアンサー率55% (1857/3366)
追加。 もっといろいろ細かい制御や、表示の変更をしたかったら、PHPを使うというのも手です。 php php-script.php でphp-script.phpに書かれたスクリプトを実行できるはず。
お礼
このへんはもう少し勉強します
- kmee
- ベストアンサー率55% (1857/3366)
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 も参考に。
お礼
丁寧な説明ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
find とか echo とか cat とかを駆使すればいいんじゃなかろうか.
お礼
そのとおりなのですが、私の力量では力技になってしまって、スマートにやる知識がありませんでした。
お礼
丁寧な説明ありがとうございます。私のやりたいことそのままです。