アプリ版:「スタンプのみでお礼する」機能のリリースについて

$ find . -name \*.doc -print

.docで終わるファイル名のものだけの検索ですが、
\で*をエスケープしないといけない理由がよく分かりません。
ここはワイルドカードの意味で使っているので、*を通常文字として
使う意味が分かりません。
どのように理解したら良いのでしょうか?

質問者からの補足コメント

  • find . -name "*.doc" -print

    でも上手くいくみたいですけど、
    この場合はシェルによるパス名展開は先行しないのでしょうか?

    No.2の回答に寄せられた補足コメントです。 補足日時:2022/07/04 19:38
  • エスケープすると、
    シェルにとっての「通常文字」になり、
    findにとっての「ワイルドカード」
    になるってことですか?

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/07/04 19:42
  • No.2さんへの質問とも重なりますが、
    上の説明だと、
    find . -name '*.doc' -print
    はOKのように思うのですが、
    find . -name "*.doc" -print
    は""内が展開されてNGになるように思うのですが、
    何故上手くいくのでしょうか?

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/07/05 00:01

A 回答 (4件)

コマンドラインに入力したメタ文字は以下の順番で処理されます



1. シェルによるメタ文字の展開 (クォートされたら対象外)
2. シェルによるクォート文字の削除
3. シェルからプログラムへ引数を受け渡し
4. プログラム find によるメタ文字の処理

例)
$ find . -name \*.doc -print
1) find . -name \*.doc -print # クォートされているので対象外
2) find . -name *.doc -print
3) args = [".", "-name", "*.doc", "-print"]
4) find により "*.doc" のメタ文字を処理 → 目的どおり動作

例)
$ find . -name *.doc -print
1) find . -name abc.doc xyz.doc -print # パス名を展開
2) find . -name abc.doc xyz.doc -print
3) args = [".", "-name", "abc.doc", "xyz.doc", "-print"]
4) find に渡るメタ文字なし → 想定外の動作

参考) よくあるエラーのようで、説明書に記載がありました
https://linuxjm.osdn.jp/html/GNU_findutils/man1/ …
この回答への補足あり
    • good
    • 0

エスケープすれば, 当該文字はシェルから見て「特定の意味を持たない」文字になる. ただし find (など) にとって「ワイルドカード」になるかどうかは別の話.



あと「上の説明」でどのように「説明」してるのかしらんけど,
find . -name "*.doc" -print
がなんで NG だと思った?

マニュアル読んでる?
    • good
    • 0
この回答へのお礼

ごめんなさい。
""でglobの展開は抑止されるのですね。
$ echo "*a"
を実行してみればいいだけの話。

お礼日時:2022/07/05 04:45

この手のコマンドはたいていシェル経由で実行されるので、シェルによるパス名展開(globbing)が先行することがあります。


その影響を防ぐためにエスケープします。

例)カレントフォルダに「a.doc」というディレクトリを作成して、以下を実行。
echo find . -name *.doc
echo find . -name \*.doc
この回答への補足あり
    • good
    • 0

「グロッピング」ってどういうこと?



さておき「誰 (何) にとって」の「ワイルドカード」であり「誰 (何) にとって」の「通常文字」だと思う?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!