30

私が行った場合

$ ls -l --color=always

ディレクトリ内のファイルのリストを取得し、さまざまなファイルタイプなどに適切な色を付けます..

lsここで、色付きの出力をパイプして、grep必要のないファイルを除外できるようにしたいと考えています。重要なのは、grep フィルターの後で色を保持したいということです。

$ ls -l --color=always | grep -E some_regex

^ grep 後に色を失う

編集: 私はヘッドレス サーバー Ubuntu 8.10、Bash 3.2.39 を使用しています。

4

2 に答える 2

53

ls独自のカラーリングがオンになっているため、grep はおそらく のカラー コードを削除しています。

あなたはこれを「することができました」:

ls -l --color=always | grep --color=never pattern

grepただし、ここで何を ping しているのかを正確に理解することは非常に重要です。greppingがls不要なだけでなく (glob代わりに a を使用)、この特定のケースでは、ファイル名とファイルの統計情報だけでなく、 !grepによって追加されたカラー コードを通じても ping が実行されます。ls

あなたの質問に対する本当の答えは次のとおりgrepです。何かにパイプlsしたり、その出力をキャプチャしたりする必要はありません。 ls人間の解釈のみを目的としています(たとえば、対話型シェルでのみ見るためです。もちろん、この目的のためには非常に便利です)。前述のように、グロブを使用して列挙するファイルをフィルタリングできます。ls

ls -l *.txt      # Show all files with filenames ending with `.txt'.
ls -l !(foo).txt # Show all files with filenames that end on `.txt' but aren't `foo.txt'. (This requires `shopt -s extglob` to be on, you can put it in ~/.bashrc)

この問題に関する次の 2 つの優れたドキュメントを読むことを強くお勧めします。

于 2009-05-15T11:13:04.657 に答える
0

バイナリを直接呼び出すだけで、本当に「本物の」 ls を使用しているかどうかを確認する必要があります。

/bin/ls ....

理由: ls が --color=always を何らかの奇妙な理由またはバグで無視しない限り、記述したコードは実際に機能するはずです。

いくつかのオプションを(直接または変数を介して)追加するエイリアスまたは関数が疑われます。そうではないことを再確認してください。

于 2009-05-15T10:47:38.633 に答える