• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:find コマンドの成否)

findコマンドの成否

このQ&Aのポイント
  • Debian 7.6でfindコマンドを使用しているが、一部の場所では正常に検索が行えず困っている。どうすれば解決できるか教えてください。
  • デスクトップの直下に001.txtが配置されている場合、cd ~/Desktopの後にfindコマンドを使用するとちゃんとファイルが見つかるが、USBメモリの場合は見つからない。解決策を教えてください。
  • findコマンドを使用してファイルを検索する際に、一部の場所では正常に検索できない問題が発生しています。解決方法を教えてください。

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

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

コマンドライン上の * は特別にファイルグロブの意味になっています。 何かファイルのあるディレクトリで、 echo * すると、意味がわかると思います。 すべてのファイル名にマッチするので、配下のファイル名がすべて表示されます。 したがって、ファイルグロブの意味でなく、コマンド固有の意味にしたいなら、 クォートしてエスケープする必要があります。 echo '*' のように。 質問の場合は、最後のは上手くいくはずと思いますが、 find . -name '*001*' とすれば良いのでは、と思います。

noname#199411
質問者

お礼

回答ありがとうございます。 回答が付いた時のメール通知をしていたつもりでしたが オフになっていましたようで、 お礼をつけるのが遅くなり申し訳ありません。 おかげさまで原因がよく理解できました。 エスケープのことは全然存じておりませんでした。 No.2 の方の所にも書いてますが、 最後のが今はうまく行っています。 これは訳が分かりません。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

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

set -x とすると、実際に実行するコマンドが表示されるようになります。 > ちゃんと見つかってくれます というのは「たまたま」です。 ~/Desktop で touch 0012.txt の後で find . -maxdepth 10 -name *001* とやってみてください。エラーになるはずです。 > find . -maxdepth 10 -name "*" | grep 001 普通に考えたら、これは成功しそうです。 ちゃんとマウントできていますか? |grepを消してfindだけにしたり、 ls -R したりしたときに、ファイル一覧が出力されますか?

noname#199411
質問者

お礼

回答ありがとうございます。 回答が付いた時のメール通知をしていたつもりでしたが オフになっていましたようで、 お礼をつけるのが遅くなり申し訳ありません。 $ cd ~/Desktop/ $ touch 0012.txt $ find . -maxdepth 10 -name 001.txt ./001.txt $ find . -maxdepth 10 -name *001* find: paths must precede expression: 0012.txt Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression] 確かに妙なメッセージが出ますね。 $ cd /media/8G $ find . -maxdepth 10 -name "*" | grep 001 ./001.txt なぜか、今これを試すときちんと見つけてくれました。 find . -maxdepth 10 -name "*" ls -R も言わずもがなです。

全文を見る
すると、全ての回答が全文表示されます。
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

find . -maxdepth 10 -name *001* が何を意味するか, わかっていますか? あと, 確認ですが ls /media/8G/001.txt の結果はどうなっていますか?

noname#199411
質問者

お礼

回答ありがとうございます。 回答が付いた時のメール通知をしていたつもりでしたが オフになっていましたようで、 お礼をつけるのが遅くなり申し訳ありません。 . は現在のディレクトリで、 -maxdepth 10 は10階層の深さまで、ですが 回答No.3 の方が書かれていることが分かっておらず、 -name *001* はファイル名に「001」を含む全てのもの、と思っておりました。 ちなみに $ ls /media/8G/001.txt /media/8G/001.txt

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 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です。

  • コマンド find の「繰り返し」正規表現

    Debian 2.6.18 を使っています。 find で正規表現を使いたいのですが、上手くいきません。 やりたいこと自体は find /foo/bar -maxdepth 1 -name '????????????????????????????????????????????????????????????????' -print で実現しているのですが、これを例えば find /foo/bar -maxdepth 1 -regex '/foo/bar/.{64}' -print のように「繰り返しの回数」を指定する形で表現できないものでしょうか? なお find /foo/bar -maxdepth 1 -regex '/foo/bar/.\{64\}' -print もやってみたのですが、ノーヒットで終了しました。 よろしくお願いします。

  • やっぱり分かりませんでした (;´Д`|||) DOSコマンドプロンプト

    先ほど、MS-DOSプロンプトについて質問したのですが、 正回答があったと思って早々と締め切ってしまったのですが、 どうも頭の回転が・・・やっぱりできませんでした。 質問は、 MS-DOSプロンプトのFINDコマンドで、 ファイルの中の検索語を検索したいというものです。 たとえばC:\My Documentsの中にtest.txtがあります。 test.txtには「hello world~」と書かれています。 そこで、test.txtファイルから、「hello」という検索語を検索する場合・・・ C:\>My Documents>FIND "hello" test.txt で、検索できます。ここまではOKです。 今度はMy Documentsの中にあるすべてのtxtファイルの中から、 ワイルドカードを使って、「hello」を探す場合、 C:\My Documents>FIND "hello" *.txt でできると思ったら、返ってきた答えは、 「ファイルが見つかりませんでした -*.txt」でした。 前の質問では、 それはFINDではなく、GREPだと教えてもらったのですが、 今使っている本が古いのか、GREPがありません。 (ちなみにOSはWindowsMeです。) 再度質問するようでたいへん申し訳ないんですが、 どなたか詳しく教えていただけないでしょうか? 質問をまとめますと、 1 ファイルの中に書かれた文字列から検索語を探すのは、FINDなのかGREPなのか? 2 FINDはワイルドカードが使えないのか? 3 使えるなら、私のパソコン(Me)がヤバいのか?

  • find -exec cp中にファイル更新すると

    find文についての質問です。 findオプション-exec cpによってコピー中に、別のファイルを更新すると、そのファイルがコピーされなくなってしまいました。 例えば、 find /tmp -mtime 1 -name "*" -type f -exec cp … により/tmp直下のファイルをコピー中に/tmp/a直下のファイルを更新すると、そのファイルはコピーできないといった結果になります。 findコマンドのオプションによりコピー可能にすることはできるのでしょうか? osはAIXです。 良い方法をご存知でしたら教えて下さい。お願いします。

  • findでエラー

    find / -name 何か  ・・とすると以下のようなエラーが出ます。これを根本的に改善するためには何をしたらよいでしょうか? 以前apacheをchrootするためにいろいろやったのが原因でしょうか?自分で理解してないでページに書いてあったことをそのまま実行したので何をしたかは覚えてないのです。ページも失念してしまいました。 一応思い出したものだけ・・・ よくわからないコマンドのひとつは mknod /chroot/httpd/dev/null c 2 2 でした。後ほかにも /etc/fstabとかをいじったり いじったものをマウントしたりしてました。 関係ないかもしれませんが・・・ find: WARNING: Hard link count is wrong for /proc: this may be a bug in your filesystem driver. Automatically turning on find's -noleaf option. Earlier results may have failed to include directories that should have been searched.

  • コマンドプロンプトで、linuxのlocateコマンドのようなコマンドはありますか?

    vista ultimateを使っています。 端的にいうと、 Cドライブ配下全体で、.log,.msi.install.exe,setup.exe のどれかの文字列を含むファイル一覧を表示させたいと思っています。 (できれば、 ☆含むではなく、 .logで終わる or .msiで終わる or install.exeと完全一致 or setup.exeと完全一致 ☆なおかつ、できれば、大文字小文字を区別しない ☆なおかつ、できれば、結果は、ファイル名だけでなく、フルパスで知りたい と思っています。 で、いま、vistaが立ち上がらないエラーが起きているので、 vistaのメディアから、コマンドプロンプトで、 それを実行しようとしています そこで。。。一案ですが・。。 コマンドプロンプトで、 linuxのlocateコマンドのようなコマンドはありますか? findというのがそれかなと思ったのですが、 linuxにおけるgrepと同じようでして。 ご存知の方いらっしゃいましたら、よろしくお願いします。

  • pdf の検索に namazu などを使うメリット

    再質問することにします。 Linux(debian wheezy) で あるディレクトリにある pdf ファイル群の中身のテキストを検索したいのですが、 find /directory_path |xargs grep -i keyword とやって検索する場合に比べて namazu groonga を使うメリットってどのくらいあるでしょうか? (他にもやり方はあるのでしょうか?) namazu を文字化けせず使うためには $ sudo update-locale LANG=ja_JP.EUC-JP LANGUAGE="ja_JP:ja" を実行しておいて ロケールを EUC-JP に変更しなければいけないので この辺りが原因で後で何か面倒なことが発生しないかも少し気になります。 どのやり方でもまず pdf を txt化しておかねばなりません。 ファイル名からやっかいな空白を削除するためには どこかのサイトに書いてあったことを使い、 pdftotext の処理には以前の質問で教えていただいたことを応用 (応用というかほとんどそのままですが)して $ find . -name "* *" | rename 's/ /_/g' $ find ./ -name '*.pdf' -print | while read line;do ${line} ${line%.pdf}.txt;done とやればいいと思います。

  • grepでの抽出箇所のみ置換して上書き

    例えば find ./ -name file_name -exec grep -B 2 "earth" {} \; -print | grep "moon" というコマンドを実施し、出力が planetkind moon だったとします。 このfile_nameファイルの一部にある 『 planetkind moon』 という箇所を 『 planetkind taiyo』 に変更したいのですが、 find ./ -name file_name -exec grep -B 2 "earth" {} \; -print | grep "moon" | xargs sed -i "s/moon/taiyo/" とすると、ファイル中の全てのmoonがtaiyoになってしましまいます。 このgrepでの抽出箇所のみ置換して元ファイルを上書きする方法は有りますか? 以上、宜しくお願いいたします。

  • DOSコマンドの動き

    こんにちわ、プログラム初心者です。 perlプログラムで、現在 `query session /server:[サーバー名] | grep -c Active >name.txt`; で、DOSコマンドを利用してActiveの数を取得しています。DOSを利用することで、実行毎にデスクトップ画面に表示されてしまいます。なのでなんとかしてこの表示を消したいので方法を探しています。 DOSを使わないでこのActiveを取得できる方法がまったく思いつかない状態です。どんな言語ならできるんでしょうか?なんの言語でもいいのでアドバイスをください。お願いします。

  • 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 ; }