コマンド ls | grep はディレクトリのみを表示します (ファイルも表示する必要があります)

コマンド ls | grep はディレクトリのみを表示します (ファイルも表示する必要があります)

Linux には、文字どおり「スクラップ」を含む多数のファイルとディレクトリを含むファイルがあります。 入力するとls *scrap*問題なく表示されます。 ただし、文字どおり「スクラップ」を含むディレクトリも返されるため、それらを除外したいと思います。

ls | grep ".*scrap.*"またはを試してみましたls | grep scrapが、ディレクトリのみが返されます (通常のファイルは返されません)。

なぜそうなるのでしょうか?

次のステップは (担当者が正しい出力を返したら) その出力からディレクトリを削除することです。その方法についての提案も歓迎します。

答え1

実際には、現在のディレクトリ (第 1 レベル) 内の名前に が含まれるすべての通常ファイルを最終的に一覧表示するには、 +scrapは必要ありません。lsgrep

古き良きfind指示:

find . -maxdepth 1 -type f -name "*scrap*" -ls

答え2

ファイル名にスペースや(さらに悪いことに)改行が含まれているとls、問題が発生します。ただし、安全なファイル名を使用すると、次のようにすることができます。grep

ls -l | grep -oP '^-.* \K.*$'
ls -l | sed -n '/^-/s/^.* //p'

しかし、通常はこのfindアプローチを使用する必要があります。

答え3

現在のディレクトリ内の を含む非ディレクトリ ファイルの名前についてはscrap、次のようになりますzsh

print -rC1 -- *scrap*(ND^/)

ls *scrap*(またはより正確には)では、ファイルのls -- *scrap*いずれかが*scrap*ディレクトリ、その後lsコンテンツ(そのディレクトリである 1 つのファイルにのみ展開されないthat-scrap-dir:限り、ヘッダー付き)。*scrap*

ファイルの種類の場合にこれが必要な場合ディレクトリls他の種類のファイルと同様に名前だけを出力する場合は、オプションを追加する必要があります-d

ls -d -- *scap*(D^/)

lsしかし、 が呼び出されるまでに、名前とタイプでファイルを検索する作業はすべてシェルによって実行されているため、を使用する意味はほとんどなく、シェルのls組み込みprintまたは を使用するほうがよいでしょう。printf

答え4

のように思えるこれあなたが探している答えです。この投稿では、特定のものだけが表示される理由が glob 拡張にあると説明しています。

関連情報