Linuxには、「scrap」というテキストを含む多くのファイルとディレクトリを含むファイルがあります。ls *scrap*
何の問題もなく入力すると表示できます。ただし、これは除外するテキスト「scrap」を含むディレクトリも返します。
ls | grep ".*scrap.*"
orを試してみましたls | grep scrap
が、これはディレクトリのみを返します(通常のファイルではありません)。
なぜですか?
次のステップは(代理人が正しい出力を返した後)、その出力からディレクトリを削除することです。これを行う方法の提案も歓迎します!
答え1
実際、現在のディレクトリ(最初のレベル)の名前に含まれるすべての一般ファイルを一覧表示するには+はscrap
必要ありません。ls
grep
お年寄りと一緒に過ごしてください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
いるprint
かprintf
。
答え4
〜らしいこれあなたが探している答えです。この記事では、特定のコンテンツのみを表示する理由でグローバル拡張について言及しています。