私は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*
また、同じファイル名APPLE
とfile.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*
シェルが拡張しないように、引用は重要です。