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

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

Linuxには、「scrap」というテキストを含む多くのファイルとディレクトリを含むファイルがあります。ls *scrap*何の問題もなく入力すると表示できます。ただし、これは除外するテキスト「scrap」を含むディレクトリも返します。

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

なぜですか?

次のステップは(代理人が正しい出力を返した後)、その出力からディレクトリを削除することです。これを行う方法の提案も歓迎します!

答え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それは対応する項目をリストします。コンテンツ(そのディレクトリから単一のファイルに拡張さthat-scrap-dir:れない限り、ヘッダーを含む)*scrap*

この種のファイルが必要な場合目次ls他の種類のファイルのように名前を印刷するには、次のオプションを追加する必要があります-d

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

しかし、それを使用することはほとんど意味がありません。ls名前とタイプでファイルを検索するすべての操作は、呼び出し時にシェルによってすでに完了しているため、シェルに組み込まれてlsいるprintprintf

答え4

〜らしいこれあなたが探している答えです。この記事では、特定のコンテンツのみを表示する理由でグローバル拡張について言及しています。

関連情報