ls –a
とgrep
、単一のgrepコマンドを使用して、/ usr内のすべてのファイルの名前を、文字pまたは文字rまたは文字sでリストする方法を教えてください。
これは正しいでしょうか?
ls –a | grep [prs] /usr
ls -a /usr | grep '^[prs]'
ls -a /usr
(改行文字で区切られた/usr
内のファイルのリスト)の出力から、p
、r
、またはs
文字のいずれかで始まる行を選択します。
それはおそらくあなたの教師が期待していることですが、それは間違っているか、少なくとも信頼できないものです。
ファイル名は多くの行で構成できます。これは、改行文字がLinuxまたはUNIXのファイル名に含まれる文字と同じくらい有効な文字だからです。そのため、このコマンドは、p
、q
、またはs
で始まる名前のファイルではなく、p
、q
、またはs
で始まるファイル名の行を返します。通常、ls
の出力を確実に後処理することはできません。
-a
は隠しファイル、つまり名前が.
で始まるファイルを含みます。 p
、q
、またはs
で始まるもののみが必要なため、これは冗長です。
ご了承ください:
ls /usr | grep ^[pqs]
さらに間違っているでしょう。最初の^
は、Bourne Shell、rc
、es
、またはzsh -o extendedglob
などのいくつかのシェルの特殊文字です(ただし、bash
または他のPOSIXシェルではOKです)。
次に、ほとんどのシェル(fish
は注目に値する例外です)では、[pqs]
はグロビング演算子です。つまり、^[qps]
は、シェルによって、そのパターンに一致するファイルのリスト(現在のディレクトリに対して)に展開されることを意味します。
^
を特別に扱わないbash
のようなシェルでは、現在のディレクトリに^p
というファイルがある場合、
ls /usr | grep ^p
csh
、tcsh
、zsh
、またはbash -O failglob
に一致するファイルがない場合は、エラーメッセージが表示され、コマンドはキャンセルされます。 zsh -o extendedglob
が^
がグロビング演算子である場合、^[pqs]
は、p
、q
、またはs
以外の任意のファイルを意味します。
ファイルを検索する場合は、ls
を使用しないでください。 find
コマンドを使用します。
find /usr -name '[prs]*'
/ usrの下のツリー全体を検索したくない場合は、次のようにします。
find /usr -maxdepth 1 -name '[prs]*'
@twalbergのコメントは、あなたが尋ねたオプションに最適です。エコーは隠しファイルを無視しますが、[prs]で始まるファイルのみが必要な場合、それらはフィルターされます。
他のフィルター用の隠しファイルが必要な場合、同様の解決策はls -ad /usr/[prs]*
、-dオプションはサブディレクトリのリストを抑制します。
このソリューションでは完全なパスも表示されます。最初にディレクトリに移動すると、このパスを抑制することができます。現在のディレクトリにとどまる場合は、サブシェルを使用します。/usrディレクトリが存在しない場合、lsをスキップするために&&を使用します。
(cd /usr && ls -ad [prs]*)
ディレクトリをls
してから、grep
を適用します。また、これらの文字でstartであるファイルのみを除外するために、^
文字が欠落しています。
$ ls -a /usr | grep ^[prs]
どうして
find /usr -type f -name '[prs]*'