Debian Linuxで特定のディレクトリの特定の文字を含むファイルを検索する方法

このQ&Aのポイント
  • Debian Linuxで特定のディレクトリにある特定の文字を含むファイルを検索する方法について解説します。
  • 特定のディレクトリ内にある「.abc」で始まる隠しファイルの一覧とその内容を取得する方法について説明します。
  • findコマンドの-pruneやmaxdepthが正しく機能しない場合に使用できる、特定のディレクトリの特定ファイルの一覧を検索する方法を紹介します。
回答を見る
  • ベストアンサー

ある特定のディレクトリの特定の文字を含むファイルを検索するには

Debian Linuxでbashスクリプトを記述しています。 特定のディレクトリ(1つの階層)にある ".abc"で始まる隠しファイルの一覧と、 それぞれのファイル内容を取得したいのですが ・サブディレクトリも検索してしまう。  find の-pruneやmaxdepthがききません。 lsで記述しなおしましたが ・結果を確認すると、6回同じ内容を記述しています。  正規表現が正しくないと思い書きなおしていますがうまくいきません。 target=/var/test filename=$(ls -a ${target} -name | grep '\.abc' | grep -v "~") kugirimoji="------" for i in $filename ; do echo $i cat $i echo $kugirimoji done どこを直せば、単一ディレクトリの特定ファイルの一覧を検索できるでしょうか。 同じ内容を複数回吐き出すのは、やはり正規表現が間違っているからでしょうか。 ぜひ教えて下さい。 どうぞよろしくお願い致します。

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

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

lsコマンドを使うとファイル名のみでパスが失われるので、"cat $i"したタイミングではディレクトリをその前に追加しないと、うまく動かないと思います。 この例だと"-name"が邪魔をして6回同じ内容を繰り返すところが再現できませんが、"-name"を削れば、"cd $target"をfor文の前に追加するだけで動くようです。 findだけで解決するのであれば、こんな感じでしょうか。 $ find ${target} -maxdepth 1 -type f -name '.abc*' | while read i ; do echo $i ; cat $i; echo ${kugirimoji} ; done

kiftsgate
質問者

お礼

ありがとうございます。 -nameは不要でした、すみません。 lsだとパスが消えてしまい、 findでmaxdepthが効かなかったのはオプションの順番が違ったせいなのですね。 -type f -maxdepth 1 としていました。 lsでcdを追加する方法とfind、両方さっそく試してみます。 ありがとうございました!

関連するQ&A

  • 全ディレクトリの全ファイルから特定の文字を検索

    全てのファイル、サブディレクトリの中身も含めて検索する コマンドはありますでしょうか。下記のようにしても反応がなく、 ためしにmojiと書いただけのファイルを置いてもHITせず、 どうしたら全部のファイルの中身から特定の文字列を 探し出せますでしょうか less /* |grep moji

  • 特定の文字を含まないファイルを検索

    たくさんのファイルの中から、特定の文字を含まないファイルを検索したいのですが、良い方法はないでしょうか? #正規表現を使ったgrepなんかでもできるものですか?

  • ディレクトリ内より特定の文字列を検索する際に関しまして

    文字列の検索に関して質問させていただきます。 あるファイル内から、 特定の文字列を探す際は、 grepを使用して検索をしています。 また、全体の中からファイル名を探す際なども、 findを使って、 探したりしているわけなんですが、 そうではなくて、 あるディレクトリ内にある 複数のファイル内全てから、 「特定の文字列が含まれているか?」を 探すコマンドってあるのでしょうか? 例えばこんな感じです。 ディレクトリAにファイルが10個あるとします。 この10個のファイルの中のどこかに、 「FOO_HEADER」という文字列が 存在しているか?を確認したいときに、 そう思いました。 今までなら、grepを使って、 1つずつファイル内を探したりしていました。 検索サイトで探してみたのですが、 キーワードが悪いのか、 どうも見つけることが出来ませんでした。 もしご存知の方がいらっしゃいましたら、 アドバイスの程お願い致します。 ■OS:Fedora9 ※ 通常はbashを使用しています。

  • 特定の「文字列を含まない」正規表現

    tarコマンドでファイルのアーカイブを作成しようとしています。 特定のディレクトリは対象外としたいのですが、正規表現の記述がわかりません。 ご教授いただきたくお願いいたします。 具体的には、、 --- ディレクトリ「abc」配下にあるファイルをアーカイブする場合、 tar cvf /tmp/xxxx.tar abc などと記述しますが、abc配下にある「statistics」といディレクトリはアーカイブ対象外とし、statistics以外をアーカイブしたいのですが、方法がわかりません。 シェルは bashです。 どなたかご存じの方、よろしくお願いいたします。

  • 特定ディレクトリのみ、特定拡張子のファイルを表示したくない

    表題の通りなのですが、特定ディレクトリ内にある特定拡張子のファイルのみを非表示にしたいのです。 例えば、[ file.xyz ]と言う拡張子のファイルがあったとします。それをそれぞれ[ c:\abc ][ d:\def ]と言う ディレクトリに格納し、後者のディレクトリに入った場合のみ非表示(隠し属性)とする方法はあるのでしょ うか? c:\abc\file.xyz ← 表示 d:\def\file.xyz ← 非表示(隠し属性) OSはWindows XP SP3となります。 ご存知の方、ご教示頂きたいと思います。

  • grep 正規表現の扱い方 特定のファイル郡のみを指定するには?

    ディレクトリのファイルをgrepを使った正規表現で指定したいのですが、 /hoge/temp[001-999].php のように、hogeディレクトリにあるphpファイル全てを含め、なおかつ、 /hoge/foo/temp[001-999].php のように、hoge/fooディレクトリにあるphpファイルを全て含めない正規表現の書き方を教えてほしいです。 正規表現にあまり詳しくなく、思いつくものといっても「hoge/.*.php」くらいで、当たり前ですが双方のディレクトリが含まれてしまいます・・・。 もう一つ、質問です。 /hoge/ ディレクトリにあるファイル全てを含め、なおかつ /hoge/foo/ ディレクトリにあるファイルは全て含めない という指定の仕方も教えてほしいです。 分かる方がいましたら、お手数ですがぜひ教えてください。よろしくお願いします<(_ _)>

  • .htaccess記述、ディレクトリ→特定ファイル

    .htaccessの記述についてお伺いさせてください。 現在、特定のディレクトリにアクセスがあった際に、特定のファイルに転送したいと設定を試しているのですが、上手くいきません…。 ディレクトリからディレクトリでは無く、ファイルからファイルでもありません。 同じドメイン内で、特定のディレクトリ以下の全てのファイルにアクセスがあった場合、特定のファイルに転送したいです。 具体的には、 /hogehoge/ こちら以下にアクセスがあった際、 /mogemoge/hage.html といった具合に、ピンポイントで転送表示を行いたいと考えています。 再度ですが、ドメインは同一内で行い、/hogehoge/ → /mogemoge/hage.html といった具合に指定ファイルに転送を掛けたいです。 .htaccessの記述にお詳しい方いらっしゃいましたら、アドバイスのほどよろしくお願いします。

  • UNIXで文字コードの検索は可能ですか?

    UNIXマシンで、ディレクトリを再帰的に探し、SJISで書かれたファイル一覧を取得したいのですが、どのように検索すれば良いでしょうか? とりあえず、ディレクトリ内だけでもOKです。 grep ^M *とやってみたのですが、 grep: html: Is a directory としたでず、どのファイルがSJISなのかわかりませんでした。よろしくお願いします。

  • grepで特定のディレクトリを除外して再帰検索するには?

    /hoge下のサブディレクトリ、ファイルで文字列mojiretsuを検索したいのですが 特に/hoge/foo下は除外して検索する場合には grepコマンドはどう記述したらいのでしょうか? # grep -lr mojiretsu /hoge だと/hoge/fooも検索されてしまいますよね。

  • phpのディレクトリーorファイルのパーミッション

    お世話になります。 どうやってもうまくいかないので、質問させていただきます。 phpでログファイルを書き込むようにしたいのですが、 ファイルが作成されません。 根本的なところができていないのだと思いますが、教えてください。 やりたいことは、指定のパス(docomwnt_root配下の/logまたは include/log) にyyyymmdd.logで、テキストを書き込みたいのです。 いろいろ調べて、ディレクトリの場合は 0777、ファイルは0666にchmodすればよいとのことで 変更したのに、ファイルがないといわれてしまいます。 ソースコードは以下になります。 すみません、試行錯誤の名残とdebug行が入っています。 <?php //function logout($content){ $content="test"; error_log($content,0); //ログファイル設定 // $logpath = '/log'; // if( !is_dir($logpath) ){ // die("ディレクトリが存在しません -->". $logpath); // } //日時取得 $dateobj = new DateTime(); //アクセスタイム取得 $accessTime=$dateobj->format('Y-m-d H:i:s'); //書き込む内容 $log = $accessTime . " " . $content . "\n"; // ファイル名 $date = $dateobj->format('Ymd'); // $filename = realpath( $logpath ) . '/'.$date . '.log'; // $filename = dirname(__FILE__) . '/log/'. $date . '.log'; $filename = $date . '.log'; echo $filename; $directory_path = "./log"; if( mkdir( $directory_path, 0777) ){ echo "ok<br>"; chmod( $directory_path, 0777); } else{ echo "ng<ng>"; } if( !$fp = fopen($filename, 'ab') ){ echo "cannot open file($filename)<br>"; return -1; } if( !$fp = flock($fp, FILE_APPEND | LOCK_EX) ){ echo "cannot open file($filename)"; return -1; } if( fwrite($fp, $content) === FALSE){ echo "cannot write file($filename)<br>"; return -1; } if( !fclose($fp) ){ echo "cannot close file($filename)"; return -1; } // return 0; //} ?> この場合だと cannot open file になってしまいます。 windowsばかりやってきていたのでlinuxは、、、わかりません。 いろいろ、サンプルを試しているのですが、うまくいかなくて。。。 すみません、ご指導よろしくお願いいたします。

    • ベストアンサー
    • PHP

専門家に質問してみよう