"grep"コマンドの理解、予想とは異なる結果を表示[閉じる]

私はUnixに初めてアクセスし、ディレクトリ(ディレクトリを除く)のすべてのファイルを表示しようとしましたls -p | grep -v /

次のリストが表示されます。

Process1
Process2 
Process3

ただし、コマンドを使用すると、ls -p | grep -v / | grep P*一部のプロセスのみが表示されます。すべてのプロセスを表示しないのはなぜですか?

編集する

私は小文字のpの代わりに大文字のPを使用していることに気づきました。これは間違いです。

ベストアンサー1

2 番目のコマンドでは、grep P*シェルに一致するファイル名の入力を求められます。つまり、その文字で始まるすべてのファイルにP*展開されます。P*P

set -x実行された内容を確認するためにシェルで使用されます(追跡をオフにした状態でset +x)。実際には、私がやっていることを確認するために、対話型シェルセッションでデフォルトでトレースがオンになっています。

二重引用符だけではP*この問題を解決できません。正規表現 P*また、同じファイル名APPLEfile.PP実際にはhello_world.c他のすべてのファイル名と一致し、P*ファイル名とも一致します。いいえ Pまさにそこ。

一般的に言えば、出力を解析しないでください。lsただし、以下は、文字で始まるファイルのリスト(ディレクトリではなく)を取得するより良い方法ですP

$ find . -type f -maxdepth 1 -name "P*"

-type f現在のディレクトリ().で、名前がP()で-name "P*"始まるすべての一般的なファイル()を探します。このオプションはこのディレクトリに-maxdepth 1制限されています。findそれ以外の場合は、サブディレクトリでも繰り返されます。

findあなたがやっていることをやってくださいgrep -v /削除する代わりにリストのディレクトリ選ぶ一般ファイル:

$ find . ! -type d -maxdepth 1 -name "P*"

ソケットなどの非正規ファイルも検索します。一部のシェルではエスケープまたは引用が必要です!。つまり、

$ find . "!" -type d -maxdepth 1 -name "P*"

または

$ find . \! -type d -maxdepth 1 -name "P*"

P*シェルが拡張しないように、引用は重要です。

おすすめ記事