Linux には、文字どおり「スクラップ」を含む多数のファイルとディレクトリを含むファイルがあります。 入力するとls *scrap*
問題なく表示されます。 ただし、文字どおり「スクラップ」を含むディレクトリも返されるため、それらを除外したいと思います。
ls | grep ".*scrap.*"
またはを試してみましたls | grep scrap
が、ディレクトリのみが返されます (通常のファイルは返されません)。
なぜそうなるのでしょうか?
次のステップは (担当者が正しい出力を返したら) その出力からディレクトリを削除することです。その方法についての提案も歓迎します。
答え1
実際には、現在のディレクトリ (第 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
、コンテンツ(そのディレクトリである 1 つのファイルにのみ展開されないthat-scrap-dir:
限り、ヘッダー付き)。*scrap*
ファイルの種類の場合にこれが必要な場合ディレクトリls
他の種類のファイルと同様に名前だけを出力する場合は、オプションを追加する必要があります-d
。
ls -d -- *scap*(D^/)
ls
しかし、 が呼び出されるまでに、名前とタイプでファイルを検索する作業はすべてシェルによって実行されているため、を使用する意味はほとんどなく、シェルのls
組み込みprint
または を使用するほうがよいでしょう。printf
答え4
のように思えるこれあなたが探している答えです。この投稿では、特定のものだけが表示される理由が glob 拡張にあると説明しています。