シェルスクリプトでファイル一括出力する方法

このQ&Aのポイント
  • シェルスクリプトを使用して、特定ディレクトリ以下のファイル名と内容を一括出力する方法について解説します。
  • lsコマンドやcatコマンドを使用せずに、for文を使って動的に繰り返し制御を行います。
  • また、サブディレクトリまで検索して結合する方法についても触れます。
回答を見る
  • ベストアンサー

シェルスクリプト ファイル一括出力

現在、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や印刷をしたいです。欲をいうとサブディレクトリまで検索して結合できると一番うれしいのですが・・・(まだディレクトリ数は少ないのでなんとかなります)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

#! /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 』でディレクトリを表示できますので、ディレクトリ一覧をみて対象にする階層の深さを考えても良いです。

crash___
質問者

お礼

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

その他の回答 (6)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.7

少し形式は異なりますが、簡単には、 cd /home/web more *.php > all.txt ファイル名の上下に ============= というのが入りますので、かえって見やすいのでは? サブディレクトリが一階層なら、 cd /home/web more *.php */*.php > all.txt

crash___
質問者

お礼

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

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.6

グルたちの不機嫌そうな顔が目に浮かぶので 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

crash___
質問者

お礼

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

  • dscripty
  • ベストアンサー率51% (166/325)
回答No.5

やっとコマンド名おもいだせた! cd /home/web/ pr -F -n *\.php > all.txt http://linuxjm.sourceforge.jp/html/GNU_textutils/man1/pr.1.html 20年前にこんなにもたもた回答してたらグルたちの機嫌をそこねるところだったよ!

crash___
質問者

お礼

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

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

crash___
質問者

お礼

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

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 も参考に。

crash___
質問者

お礼

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

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

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

crash___
質問者

お礼

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

関連するQ&A

  • シェルスクリプトでのファイル操作

    Linuxをつかいシェルスクリプトを組んでいます for arg in ${DIR}_/*.csv do md5sum ${arg} | awk '{printf("%s,%s\n",$2,$1)}' >> ${DIR}/HASH.csv done 上記のような処理でHASH.csvにファイル名とファイルのハッシュ情報を登録しています。 ↓登録されたデータはこんな形になります。  aa/bb/cc/xx.csv,aa339d9idedeeded・・・  aa/bb/cc/ww.csv,aa339d9idedeeded・・・   しかし、このままだとこのパスの部分『aa/bb/cc/』が邪魔なので削除したいと考え 以下のようにしましたが、うまく登録できません。 sed -e "s/\/\(aa\)\/\(bb\)\/\(cc\)\///g" ${DIR}/HASH.csv > ${DIR}/B8HASH.csv >>で出力するようにしたら削除前の下に削除後の情報が追加されてしまいました。 このような場合はどのようにしたら良いのか、ご助言お願い致します。 この方法ではなく、for文の時点で削除できるようであればその方法を教えてください。

  • Linux シェルスクリプト

    シェルスクリプトを作る際に、汎用スクリプトを作るのが上手くいきません。 例として以下の2つのシェルの作成例を教えてください。 1、スクリプト名をrei1として platex T1.tex dvipdfmx T1.dvi xdvi T1.dvi & wc -c T1.tex T1.dvi T1.pdf ではT1.tex専用なので これを $ ./rei1.sh ファイル名 と打ちこむことでどのファイルにでも適応できるようにする 2、スクリプト名をrei2.shとして 後から指定した文字列を含む (例えばaak ak aab aba naaの5つがあった時、「aa」と指定することでaak,aab,naaの3つを選ぶ) ファイルを選び出し、それを指定したディレクトリ(このディレクトリも可能なら後から指定したい) に移動する。という動作をするシェルスクリプト。

  • 複数ファイルを1つにするシェルスクリプト

    file.1 file.2 ..... file.xx とxxが連番になっている複数のテキストファイルがあります。 これを1つのファイル"file.all"にするために以下のシェルスクリプトを作ってみました。 (公開するのも恥ずかしいのですが...^ ^;) #!/bin/sh i=1 while [ $i -le 99 ]; do  cat file.$i >> file.all  let i=i+1 done これだと99までのファイルしか指定できません。 99999...とループ回数を増やせばいいのですが、 それよりももっとスマートにやる方法があるのではと思い質問を投稿いたしました。 シェルスクリプトではなくコマンドによる方法でも結構です。 (RH7.3を使っています) よろしくお願いします。

  • シェルスクリプトで

    いくつかのテキストファイルがあって, その中で内容が重複するもの(ファイル名は違うが中身は同じ)ファイルをみつけるシェルスクリプトが書きたいのですが, どのように書けばよいでしょうか. というかそのように書くことは可能でしょうか. ぶしつけですいませんが,回答お願いいたします.

  • シェルスクリプトでファイル名変更

    あるディレクトリにあるファイルの名前をシェルスクリプトで一括変更したいと思っています。 旧ファイル名 新ファイル名 apple   banana orange   lemon kiwi      melon strawberry apricot のように、新旧ファイル名(拡張子を除く)をタブで区切ってfilename.txtというファイルに入れてあります。ごらんの通り新旧ファイル名とも規則的ではありません。拡張子は新旧ともすべて.wavです。 awkもしくはreadでできるかなと思ったのですが、私の力ではできませんでした。お知恵を拝借できれば幸いです。(シェル初心者、使っているのはBシェルです)

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。

  • シェルスクリプトの作り方

    OSはVineで、bashシェルです。 シェルスクリプトの作り方ですが、 1.ファイルを作る。 例えば、 #!bin/sh cd tmp このとき、ディレクトリはどこでもいいのでしょうか? 2.権限を付ける。 chmod u+x filename 3.実行 ./filename 他に気をつけることはないでしょうか? 実行すると、 bash: ./filename: bad interpreter: そのようなファイルやディレクトリはありません となってしまって、どうしても実行できません。

  • シェルスクリプトで古いファイルの自動削除をするには?

    UNIXで以下の仕様を持つシェルスクリプトを作成しようと していますが、どうもうまくいきません。 どなたか、いい知恵を貸していただけないでしょうか? 目的: 特定のディレクトリ内にあるファイルについて、 システム日付より3日前のタイムスタンプを持つファイルを 削除する。 留意点: ・削除対象のファイルは複数存在する場合がある。 ・ファイルサイズは1件あたり 0byte-数百Mbyte となる  可能性がある。 ・ファイル名は不定。 ・スクリプトはBシェルまたはCシェルとする。 参考: ・現在使用しているOSについて  ls -l でのタイムスタンプにおける出力形式は以下のとおり  (デフォルト値?)  ・ 9月 28日 2000年    または   10月 24日 10時45分 知っている限りのコマンドを使っていろいろやってみたんですが、 結局ダメでした。 よろしくお願いします。

  • シェルスクリプトとphpを使ったプログラミングについて

    UNIXサーバで、現在、シェルスクリプトやphpを使ってプログラムを書いています。 今は「csh cmd ファイル名」という形でシェルスクリプトを実行しています。このままではプロンプト画面で味気ないので次のようにしたいのですが、やり方が分りません。 まず、phpやhtmlで作成したファイル提出画面にてファイルを提出してもらいます、そして、それを受け取ります。その時例えば送信ボタンを押すと思うのですが、そのボタンを押したらファイル名を受け取り「csh cmd ファイル名」が実行されるといふうにしたいのです。何かいい方法があれば教えて頂きたいです。phpでなくてもいいので、お願いします。

    • ベストアンサー
    • PHP
  • シェルスクリプトでファイル削除したい

    シェルスクリプト初心者です 今回、Linuxサーバ側にある複数のファイルを削除する 必要が出てきました このため、シェルスクリプトを書いて複数(2000程度) のファイルを削除しようとして試験をしています 試験のLinuxサーバ側の/root の中にfile1,file2・・・ 等々を置いています そこに次のようなスクリプトを記載して ファイルが置かれている場所と同じ/rootに置いて実行させるのですが ************** スクリプト ******** #!/bin/sh echo "start" # # rm F1010002.JPG rm F1010003.JPG rm F1010004.JPG echo "end" ****************************** 下記のようなエラーが出ます ****************************************** start rm: cannot lstat `F1010002.JPG\r': そのようなファイルやディレクトリはありません rm: cannot lstat `F1010003.JPG\r': そのようなファイルやディレクトリはありません rm: cannot lstat `F1010004.JPG\r': そのようなファイルやディレクトリはありません end ****************************************** サーバ側にSSHで入って、 # rm F1010002.JPG とひとつひとつ打鍵していくとファイルは削除されます スクリプトの間違い等あるのでしょうか 教えていただければ幸いです なお、ファイル数2000件程度のスクリプトを記載する方法は 別のソフトを利用して作成できるので・・・その件はいいのですが・・・