ls --colorsが機能しない|

ls --colorsが機能しない|

次のコマンドを使用して、すべての隠しディレクトリを一覧表示しようとします。

ls -lhAF1 | grep -E '^d.*[0-9]{2}:[0-9]{2} \.'

良い結果

正規表現の説明:d、テキスト、タイムスタンプ、スペース、ドット、および追加のテキスト形式のすべての行を取得しようとしています。

ただし、次のコマンドを使用してls出力の色を指定しようとすると、次のようになります。

ls --color -lhAF1 | grep -E '^d.*[0-9]{2}:[0-9]{2} \.'

結果が0でなしの出力は次--colorのとおりです。

drwxr-xr-x 1ユーザーグループ4096 2月1日08:48 .invisible

ls / grepがこれを行うのはなぜですか?

答え1

--color色のエスケープシーケンスを追加します。出力をファイルにリダイレクトすると、ls --colorこれを確認できます。

次のようになります。

 drwxr-xr-x  6 root root 4.0K Jan  9 08:23 ^[[01;34m.cabal^[[0m/

この問題を解決するには、以下を試してください。

 ls -lhAF1 --color | grep -E '^d.*[0-9]{2}:[0-9]{2} .*\.'

答え2

分析ls一般的に悪い考え。頻繁にいつもそうではない。ここに別の提案があります。必要なディレクトリをまとめて収集し、そのコレクションをに渡しますls

find .* -maxdepth 0 -type d \( -name '.[^.]' -o -name '.??*' \) -exec ls -ld --color=always {} +

誰かが、元のコードが実際にディレクトリのリストを過去6ヶ月以内に変更されたディレクトリに制限したことを指摘しました。この問題は、次の代替ソリューションで処理できます。

find .* -maxdepth 0 -type d -mtime -180 -mtime +0 \( -name '.[^.]' -o -name '.??*' \) -exec ls -ld --color=always {} +

いつものように、find末尾を理解していない場合は、効率を犠牲にして+末尾を交換してください。\;

答え3

その理由は、ls端末に接続されていても出力は常に色があるからです。からman ls

   --color[=WHEN]
          colorize the output.   WHEN  defaults  to  'always'  or  can  be
          'never' or 'auto'.  More info below

grepたとえば、標準出力が端末の場合は色を維持しませんが、何らかのls理由で異なる動作をするように設計されている他の多くのツールもあります。シェーディングされた出力は、以下を使用して達成されます。ANSIエスケープコード端末で解釈されます。出力をlsファイルにリダイレクトし、エディタで開きます。

$ ls --color  -lhaF1  > /tmp/RESULT
$ less /tmp/RESULT
total 12K
drwxr-xr-x  3 ja   users 4.0K Feb  2 09:47 ESC[0mESC[01;34m.ESC[0m/
drwxrwxrwt 12 root root  4.0K Feb  2 09:51 ESC[30;42m..ESC[0m/
drwxr-xr-x  2 ja   users 4.0K Feb  2 09:47 ESC[01;34m.invisibleESC[0m/
-rw-r--r--  1 ja   users    0 Feb  2 08:35 a|a

変数を設定した場合は、色の代わりに元のエスケープコードが表示されるように$LESS実行する前に設定を解除する必要があります。less要約すると、--colorgetsを使用したときにgrep得られるものは見えませんが、それに応じていくつかのエスケープコードです。この問題を解決するには、--colorsまったく使用しないか、次のように設定してください--auto

$ ls --color=auto -lhaF1 | grep  -E '^d.*[0-9]{2}:[0-9]{2} \.'

答え4

grepとにかく、安定して後処理できない出力に適用するのではなく、渡されたファイルのリストをフィルタリングしたいと思います。次のようになります。lsls

ls -lFhd --color -- .*(/)

存在するzsh。あるいは、自分のアプローチからわかるように、特別な権限を持つディレクトリではなく、6か月前に最後に変更されたディレクトリのみが必要です。

ls -lFhd --color -- .*(/mM-6mM+0f-7000)

関連情報