unixのfindコマンドで指定のファイル名を検索し、grepする方法

このQ&Aのポイント
  • unixのfindコマンドを使用して、複数のディレクトリから指定のファイル名を検索し、その結果をgrepする方法について教えてください。
  • 特定のディレクトリの中の拡張子が*.txtのファイルを検索し、grepを実行する方法について教えてください。
  • Solaris 11.3上でのfindコマンドの使い方について教えてください。
回答を見る
  • ベストアンサー

unixのfindコマンド

unixのfindコマンドで、ある複数のディレクトリから指定のファイル名だけを 検索し、その結果をgrepしたいのですが、 例えば 01_dir 02_dir : 11_di : 21_dir : と言うディレクトリがあります。 そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを 検索し、その検索したファイルに対して、grepを実行したいのですが、 上手くいきません。 もちろん、各ディレクトリには、「.txt」以外のファイルもありますし、 ファイル名にも条件を付与したいです。 以下の様に、 find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs ls *.txt | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls -l '{} /*.txt' | grep "検索文字" find . -name "0*_dir" -type d -print | xargs -i ls {} "検索文字" とやってみたのですがだめでした。 find ./ -type d \( -name '1_*dir' -o -name '2*_dir' -o -name '3*_dir' \) -prune -o -type f -print と「-prune」で除外するディレクトリを指定すればできなくはないですが、 すべてのディレクトリ書くのはいい方法ではないです。 よい方法をお願いします。 OSは、Solaris 11.3です。

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

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.3

> そこから、「0」で始まっているディレクトリの中なら拡張子が*.txtを これがカレントディレクトリだけの話なら find 0*_dir -name '*.txt' -exec grep "検索文字" '{}' + > find . -name "0*_dir" -type d -print | xargs ls -l *.txt | grep "検索文字" xargs 使うならファイル名が grep の引数に渡らないと意味ないので、 find 0*_dir -name '*.txt' | xargs grep "検索文字" /dev/null それから再帰的に 0*_dir/*.txt を探したいなら find `find . -type d -name '0*_dir'` -name '*.txt' -exec grep "検索文字" '{}' + -path が使えるなら (Solaris だと多分使えないけど) find . -path '*/0*_dir/*.txt' -exec grep "検索文字" '{}' +

abc999xyz
質問者

お礼

ありがとうございます。 findの方法を何種類か記載して頂いて勉強になります。 4番目の「-path 」を使うのは、Solarisでは使えません

その他の回答 (3)

  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.4

回答No.1の者です。 "xargs basename"の部分はmacOSで試したところでは動いていたのですが、Linuxでは"xargs basename -a"としないとエラーになりますね。Solarisのbasenameには-aオプションはないみたいです。 ところで、やりたかったことは結局(b)だったのですか?

abc999xyz
質問者

お礼

ありがとうございます。 ls 0*_dir/*.txt | xargs -i basename '{}' | grep "検索文字" としたら動きましたが、grepがうまくいきませでした。 ファイル名に対してgrepを行っていました。 本当はファイルの中身にgrepを行いたかったですが。 やりたかったことは、(b)案ですが、(b)案の結果をfindとgrepを使って やろうと考えていました。

  • notnot
  • ベストアンサー率47% (4847/10260)
回答No.2

やりたいことが不明瞭です。日本語の説明は明瞭ですが、コマンド例がそれとかけ離れているので。 > 「0」で始まっているディレクトリの中なら拡張子が*.txtを検索し、その検索したファイルに対して、grepを実行したいのですが、 という日本語だけを信じて回答すると、 grep "検索文字" 0*/*.txt か、 find `find -type d -name "0*" -print` -type f -name "*.txt" -print | xargs grep "検索文字"

abc999xyz
質問者

お礼

ありがとうござます。 grepの方法でも、findの方法でも結果が表示されました。 findの実行結果に、さらに、findをかぶせるのですね。 パイプだと展開されないのでできないですね。

  • _kappe_
  • ベストアンサー率68% (1522/2216)
回答No.1

(a)ファイル名のリストに対してgrepしたいのか、(b)条件を満たしたファイルの中身に対してgrepしたいのか読み取れませんでしたが、もっと単純にこんな感じではどうでしょうか。 (a) ls 0*_dir/*.txt | xargs basename | grep "検索文字" (b) grep "検索文字" 0*_dir/*.txt

abc999xyz
質問者

お礼

ありがとうございました。

abc999xyz
質問者

補足

ありがとうございます。 (a)案は上手くいきませんでした。 Usage: basename string [ suffix ] がでます。 因みに、 ls 0*_dir/*.txt | xargs -i basename '{}' | grep "検索文字" としたら、 xargs: Could not exec command: No such file or directory となりました。 名前だけ渡しているからディレクトリがないので当たり前です。 (b)案は上手くいきました。 最初からgrepですればよかったのに思いつかなかったか。何をfindでと。

関連するQ&A

  • シェルのfindコマンドであるディレクトリ以外のファイルを検索

    ホームディレクトリにある.(例.dtや.atok)ディレクトを検索対象から外し尚且つ、*aa*のファイルを検索するにはどうしたら良いでしょうか? find . -type d -name .dt -prune -o -print | xargs grep "*aa*" でいろいろやってみましたができませんでした。 OS:HP-UX K-Shellです どうぞ宜しくお願いいたします。

  • 【Linux】findコマンドの表示順

    linuxのfindコマンドについて質問です。 例えば、あるディレクトリの構成が以下の通りだったとします。 /dir1/aaa.txt /dir1/zzz.txt /dir1/dir2/bbb.txt このとき、 find *.txt | sort を行うと /dir1/aaa.txt /dir1/dir2/bbb.txt /dir1/zzz.txt という順に表示されます。 (文字としてはソートされていますが、ディレクトリ構造としては滅茶苦茶です。) しかし、ファイル名を表示する際は通常はディレクトリ毎に表示したいため、 1つ目の例の順のように表示される必要があります。 このとき、どのようにすればfindによる検索結果を1つ目のようにディレクトリ順に表示できるのでしょうか。 実際はディレクトリ構成が複雑で、ファイルもディレクトリも非常に多くあります。

  • UNIXの"find"コマンド同等のプログラム作成について

    お世話になっております。 現在UNIXの"-type f"オプションのついた"find"コマンドと同等のプログラムをC言語で作ろうとしています。 つまりディレクトリ内のファイル(サブディレクトリ内のファイル含む、ディレクトリは除外)を全てフルパスで表示するプログラムです。 現在下記の関数を作成したのですがうまく動いてくれません。 どなたかご教授いただけないでしょうか。 【問題】 プログラム内の(**)前後で"dir1"が変更される。 (**)前:"/ディレクトリA/" (**)後:"/ディレクトリA/ディレクトリA内のファイル1" 本当は"dir1"には:"/ディレクトリA/"のままであってほしいです。 "strcat"コマンドの仕様が影響しているのでしょうか。 int _find(char dir1[] , int k ,int l , int m ) { DIR *dir ; struct dirent *dp ; struct stat statbuf ; char txt[1000] ; if ( m == 0 ) l++ ; if ( (dir = opendir(dir1)) == NULL ){ printf("%s",dir1) ; perror("opendir") ; exit(1) ; } for( dp=readdir(dir) ; dp != NULL ; dp=readdir(dir) ){ if ( strcmp(dp->d_name,".") != 0 && strcmp(dp->d_name,"..") != 0 ){ /* ROOT_DIR名-にファイル名を付け加えて、フルパスにする */ strcpy( temp[k][l] , dir1) ; strcat( temp[k][l] , "/" ) ; strcat( temp[k][l] , dp->d_name ) ;  (**) stat( temp[k][l] , &statbuf ) ; if(S_ISDIR(statbuf.st_mode)){ l=_find(temp[k][l],k,l,1) ; }else{ sort[k][l]=temp[k][l] ; printf("temp[%d][%d]=%s\n",k,l,sort[k][l]); printf( "dir5=%s\n",dir1) ; l++ ; } } } closedir(dir) ; return l ; }

  • findコマンドについて

    unix コマンドについて質問です。 ファイル1の中に"A=1" ," B=2", "C=3"という文字列が入っているとします。 ファイル2の中に"D=1" , "E=2", "F=3"という文字列が入っているとします。 そのことを自分は知りません。 Aという文字が入っているファイルを探す為、 以下のfindコマンドを打ち、ファイル1のlsの結果が表示されました。 find ./ -type f -exec grep 'A' {} \; -ls その後、出力されたファイル1の中からBとCでgrepしてB=2", "C=3"を表示したいと思います。 上のコマンドと併せて一度でできるコマンドを教えていただけないでしょうか? 宜しくお願いします。

  • find コマンド(Unix)

    find コマンドで検索条件をANDで結んだりしたいのですが、うまくいきません。 あるサイトをまねて、find . -name abc -and -type d とやったのですが、-andでエラーメッセージが出てしまいます。(エラーメッセージはfind: bad option -andとfind:path-list predicate-list)-orの場合でも同じです。kshを使ってます。-and を使わないでfind . -name abcの時はきちんと検索できます。どなたか分かる方回答お願いします。

  • find コマンドの成否

    OS は Debian 7.6 ですが、 ~/Desktop の直下に 001.txt を配置しているのですが、 $ cd ~/Desktop の後に次のコマンドを打つと $ find . -maxdepth 10 -name *001* ./001.txt と、ちゃんと見つかってくれます。 ちなみに -maxdepth 10 は念のためにつけておいたものです。 /media/8G でマウントされているUSBメモリの直下に 001.txt を配置していても $ cd /media/8G の後に $ find /media/8G -maxdepth 10 -name *001* $ find . -maxdepth 10 -name * | grep 001 $ find . -maxdepth 10 -name "*" | grep 001 のいずれを試しても、001.txt を見つけてくれません。 なぜこうなるのかサッパリわかりません。 どうしたらいいかお教え下さい。 よろしくお願いします。

  • findの結果をlsで詳細表示

    はじめまして。 Linux初心者です。 カレントディレクトリ以下のディレクトリやファイルの一覧を詳細表示するには「find ./ | xargs ls -lF」などとすると思いますが xargsを使用せずに「find ./ | ls -lF」とすると、なぜNGなのでしょうか。「xargs」の意味を調べると、 (1) 標準入力から空白か改行で区切られた文字列群を読み込む。 (2) xargsの引数のコマンドの後ろに、標準入力から受け取った文字列群を付け足して、そのコマンドを実行する。 とありました。上記の説明で「xargs」を付けることによる効果はわかるのですが、ls以外のコマンドを使用する際にもfindと組み合わせる際には、 すべてのコマンドで「xargs」を使用しなければいけないのでしょうか。 lsの結果をmoreする際などには、「ls | more」で良いと思うのですが、 「ls | xargs more」としない理由がわかりません。 どなたかわかりやすく教えて頂ければ幸いです。 よろしくお願いします。

  • findとxargsの使い方で

    unixで、findとxargsを使って検索を行っています。 以下の様に、 find . -type f | xargs コマンド 例えば、 find . -type f | xargs ls -l を実行すると、 「xargs: 入力ファイルが壊れています。: バイトシーケンスが正しくありません。」 が出力されます。 何が原因なのでしょうか。 また、解消方法はどのようにすればよいのでしょうか。 環境は solaris10 LANG=ja_JP.UTF-8 sh or bash

  • findで複数の場所から検索

    findで  /dir1 または /dir2 (さらには /dir3 も)からのファイルの検索はどのように書けばいいでしょうか? $ find "/dir1|/dir2" -name "nanashi" find: `/dir1|/dir2': そのようなファイルやディレクトリはありません $ find (/dir1|/dir2) -name "nanashi" bash: 予期しないトークン `/dir1' 周辺に構文エラーがあります よろしくお願いします。

  • UNIXコマンド "grep" "find" の使い方教えて下さい。

    1)以下(1)、(2)を検索したいとします。  (1)"wrk_str"という文字列の記述があるファイル名  (2)tmp_file.c という名前のファイル名 2)ディレクトリ構成が以下になってるとします。  /home/users/複数のディレクトリが存在/複数のディレクトリが存在/複数のファイルが存在 3)/home/users/ 配下に検索したい文字列、ファイルがあるとした場合、どのように   探せばいいでしょうか?   /home/users/配下で得に条件なしでgrepすると、"Arg list too long"(量が多い?)の   メッセージが出て、検索できませんでした。 UNIXコマンドに詳しい方、宜しくお願いします。 それ以外にも、色々検索方法知っていたら教えて下さい!!