web-dev-qa-db-ja.com

grepおよびls -aコマンドの使用

ls –agrep、単一のgrepコマンドを使用して、/ usr内のすべてのファイルの名前を、文字pまたは文字rまたは文字sでリストする方法を教えてください。

これは正しいでしょうか?

ls –a | grep [prs] /usr
9
Nicole Romain
 ls -a /usr | grep '^[prs]'

ls -a /usr(改行文字で区切られた/usr内のファイルのリスト)の出力から、pr、またはs文字のいずれかで始まる行を選択します。

それはおそらくあなたの教師が期待していることですが、それは間違っているか、少なくとも信頼できないものです。

ファイル名は多くの行で構成できます。これは、改行文字がLinuxまたはUNIXのファイル名に含まれる文字と同じくらい有効な文字だからです。そのため、このコマンドは、pq、またはsで始まる名前のファイルではなく、pq、またはsで始まるファイル名の行を返します。通常、lsの出力を確実に後処理することはできません。

-aは隠しファイル、つまり名前が.で始まるファイルを含みます。 pq、またはsで始まるもののみが必要なため、これは冗長です。

ご了承ください:

ls /usr | grep ^[pqs]

さらに間違っているでしょう。最初の^は、Bourne Shell、rces、またはzsh -o extendedglobなどのいくつかのシェルの特殊文字です(ただし、bashまたは他のPOSIXシェルではOKです)。

次に、ほとんどのシェル(fishは注目に値する例外です)では、[pqs]はグロビング演算子です。つまり、^[qps]は、シェルによって、そのパターンに一致するファイルのリスト(現在のディレクトリに対して)に展開されることを意味します。

^を特別に扱わないbashのようなシェルでは、現在のディレクトリに^pというファイルがある場合、

ls /usr | grep ^p

cshtcshzsh、またはbash -O failglobに一致するファイルがない場合は、エラーメッセージが表示され、コマンドはキャンセルされます。 zsh -o extendedglob^がグロビング演算子である場合、^[pqs]は、pq、またはs以外の任意のファイルを意味します。

9

ファイルを検索する場合は、lsを使用しないでください。 findコマンドを使用します。

find /usr -name '[prs]*'

/ usrの下のツリー全体を検索したくない場合は、次のようにします。

find /usr -maxdepth 1 -name '[prs]*'
6
Andy Lester

@twalbergのコメントは、あなたが尋ねたオプションに最適です。エコーは隠しファイルを無視しますが、[prs]で始まるファイルのみが必要な場合、それらはフィルターされます。
他のフィルター用の隠しファイルが必要な場合、同様の解決策はls -ad /usr/[prs]*、-dオプションはサブディレクトリのリストを抑制します。
このソリューションでは完全なパスも表示されます。最初にディレクトリに移動すると、このパスを抑制することができます。現在のディレクトリにとどまる場合は、サブシェルを使用します。/usrディレクトリが存在しない場合、lsをスキップするために&&を使用します。

(cd /usr && ls -ad [prs]*)
2
Walter A

ディレクトリをlsしてから、grepを適用します。また、これらの文字でstartであるファイルのみを除外するために、^文字が欠落しています。

$ ls -a /usr | grep ^[prs]
0
Mureinik

どうして

 find /usr -type f -name '[prs]*'
0
Mithrandir