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)

관련 정보