GNU/Linux >> Linux の 問題 >  >> Ubuntu

Grepと*ワイルドカードについて混乱していますか?

「flash_drive_data」とは関係のないすべてのファイル/ディレクトリを見つけるために、次のコマンドを実行しています。

find . -not -path './flash_drive_data*' | grep "./*flash*"

私が試したいくつかのことで私を混乱させています:

1.上記のコマンドを実行すると、いくつかの「部分的な」ヒットが発生します(つまり、*flash*と完全には一致しません) パターン。例:

./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi

3/flas 最後に強調表示されています。

2. grep "*flash*"を置き換えたとき grep "*"だけで 、findによってすべてのファイルが返されることを期待していましたが、何も返されませんでした。なんで?次に、grep "**"を実行したとき 私はすべてのファイルを入手したと思います(または少なくとも私は入手したと思います)。繰り返しますが、それはなぜですか?

3.最後に、上記で行ったことの目的は、find . -not -path './flash_drive_data*' flash_drive_dataに関連するものは何もありませんでした。私がやったように見えました(上で説明したように、grepで予期しない動作が発生しました)。ただし、実行したとき:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +

次のような出力を取得していました:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

そのため、flash_drive_dataファイルが含まれていました。

承認された回答:

find . -not -path './flash_drive_data*' | grep "./*flash*"

ここで重要なのは、grep find -pathが正規表現を使用している間、 シェルグロブスタイルのパターン一致を使用します。アスタリスクは、これら2つで異なる意味を持っています。

正規表現./*flash* 最初に任意の文字に一致します(. )、次に0個以上のスラッシュ(/* )、次にリテラル文字列flas 、次に任意の数(0個以上)のh 文字。 3/flas それに一致します(hの0倍) )、そして例えばreflash/の0倍 。

grep flashを使用するだけで済みます 代わりに、入力のどこにでも一致するため、先頭と末尾の「何にでも一致する」部分は不要です。

または、find -path './*flash*' -and -not -path './flash_drive_data*'を使用します

grep "*flash*"を置き換えたとき grep "*"だけで 、[一致なし]を取得しました。

アスタリスクは「前のアトムの任意の数」を意味するため、ここではあまり明確に定義されていません。 grep これは文字通りのアスタリスクとして解釈されますが、実際にはエラーである必要があります。

ただし、実行したとき:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' + 次のような出力を取得していました:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

したがって、flash_drive_data ファイルが含まれていました。

tarに注意してください ファイルを再帰的に保存し、そのfindの最初の出力 . 現在のディレクトリの場合、すべてが保存されます。 ! -type d findを使用 出力からディレクトリを除外するには、または(より良い)-exclude=PATTERNを見てください tarのオプション 。


Ubuntu
  1. Ubuntu21.10でMACアドレスを検索する

  2. ls と grep を使用して実行可能ファイルを見つける

  3. Linux での fork() と grep の意味は何ですか?

  1. 出力の検索を制限し、信号13を回避しますか?

  2. ファイル内の複数の文字列のGrepを実行し、サイズ順にファイルを一覧表示しますか?

  3. Cut / Grep And Df -h?

  1. Linuxで最大のファイルとディレクトリを探す

  2. Grep And Tail -f?

  3. Grepのみを使用して最初のオカレンスのみを検索しますか?