次のコマンドを使用して、すべての隠しディレクトリを一覧表示しようとします。
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
要約すると、--color
getsを使用したときにgrep
得られるものは見えませんが、それに応じていくつかのエスケープコードです。この問題を解決するには、--colors
まったく使用しないか、次のように設定してください--auto
。
$ ls --color=auto -lhaF1 | grep -E '^d.*[0-9]{2}:[0-9]{2} \.'
答え4
grep
とにかく、安定して後処理できない出力に適用するのではなく、渡されたファイルのリストをフィルタリングしたいと思います。次のようになります。ls
ls
ls -lFhd --color -- .*(/)
存在するzsh
。あるいは、自分のアプローチからわかるように、特別な権限を持つディレクトリではなく、6か月前に最後に変更されたディレクトリのみが必要です。
ls -lFhd --color -- .*(/mM-6mM+0f-7000)