ls -l에서 마지막 k 열만 표시하는 방법은 무엇입니까?

ls -l에서 마지막 k 열만 표시하는 방법은 무엇입니까?

ls -l처음 4개 열을 제거하여 명령에 표시되는 열을 제한하고 싶습니다.

ls -lh보여주다:

drwxr-sr-x 20 gamma alpha 4.0K May 22 13:18 Desktop
drwxr-sr-x  3 gamma alpha   22 Oct  6  2014 Eclipse
-rw-r--r--  1 gamma alpha  28K Jul 11  2014 fire
drwxr-sr-x  5 gamma alpha   48 Mar 31  2014 lb_deployment

처음 4개 열을 제거하기 위해 ls -lh | cut -d " " -f5-. 그러나 예상대로 동작하지 않습니다.

4.0K May 22 13:18 Desktop
alpha  22 Oct  6  2014 Eclipse
alpha 28K Jul 11  2014 fire
alpha  48 Mar 31  2014 lb_deployment

나는 다음과 같은 모습을 좋아합니다.

4.0K May 22 13:18 Desktop
  22 Oct  6  2014 Eclipse
 28K Jul 11  2014 fire
  48 Mar 31  2014 lb_deployment

예상대로 동작하지 않는 이유는 에서 cut구분자를 공백( -d " ")으로 정의했는데 첫 번째 파일( 의 두 번째 열)에 대한 링크 수가 \ls -lh2자리 숫자(20)이므로 ls -lh하나 더 추가했기 때문입니다. 1비트 링크 카운터를 사용하면 파일의 링크 카운터에 공백이 추가되어 열 위치를 조정할 수 있습니다. 이로 인해 cut예기치 않은 동작이 발생합니다.

이 문제를 해결하는 방법에 대한 아이디어가 있습니까?

답변1

사용자 및 그룹 열을 생략하려면 -o및 옵션을 전달합니다 . -g사용자 및 그룹 이름에는 공백이 포함될 수 있으므로 안정적으로 편집할 수 없습니다.

권한 및 링크 수 열을 생략할 수 있는 옵션은 없습니다. 유지하려는 첫 번째 열은 공백(오른쪽 정렬의 경우)으로 시작할 수 있으므로 공백을 공백이 아닌 변환으로 시작 기준으로 사용할 수 없습니다. 대신, 마지막 열의 오른쪽 가장자리를 사용하여 원하지 않는 열을 제거하세요. 처음 두 열에는 공백이 포함될 수 없으므로 안전합니다.

ls -lhog | sed 's/^[^ ][^ ]*  *[^ ][^ ]* //'

sed 명령 설명:

  • s/REGEXP/REPLACEMENT/각 줄에서 지정된 정규식의 첫 번째 항목을 지정된 대체 텍스트로 바꿉니다. 여기의 대체 텍스트가 비어 있습니다.
  • ^줄의 시작 부분에서만 일치하도록 정규식의 시작 부분에 추가합니다.
  • [^ ][^ ]*공백을 제외하고 비어 있지 않은 문자 시퀀스와 일치합니다.
  • 따라서 sed 명령은 공백이 아닌 첫 번째 및 두 번째 시퀀스와 다음 공백을 제거합니다(그러나 끝에 공백은 하나만 있음).

답변2

이것은 나에게 효과적입니다.

ls -lhn | sed -r 's#^\S+(\s+\S+){3}##'

사용자 및 그룹 이름을 숫자 ID로 변환하는 추가 -n플래그입니다 . ls결과적으로 우리는 제거할 알려진 수의 필드를 얻습니다.

-rwxr-xr-x  1 1001 1001 1.4K Mar 23 18:07 something.sh

각 열 사이의 공백은 가변적이지만 ls열을 정렬하는 데 사용되므로 맹목적으로 제거할 수는 없습니다. 나는 주요 권한 블록을 제거한 다음 세 그룹을 제거하기로 결정했습니다.빈 텍스트와 비어 있지 않은 텍스트, 각각 링크 수, uid 및 gid와 일치합니다. 그러면 정렬이 계속 작동할 수 있도록 gid와 파일 크기를 구분하는 공백이 그대로 유지됩니다. 정규식은 sed이 패턴 삭제를 구현합니다. #...#...#구분자 제공(성냥그리고바꾸다), 이 -r플래그를 사용하면 확장 정규식을 사용할 수 있습니다. 구조적으로 ^줄의 시작 부분에 일치 항목이 있습니다 . \S+하나 이상의 공백이 아닌 문자에 대한 일치 항목과 \s+하나 이상의 공백 문자에 대한 일치 항목이 있습니다. 대괄호는 (...)두 항목을 함께 그룹화하고 중괄호는 {3}그룹이 다음과 같아야 함을 나타냅니다. 3번 반복.

 4.0K Jun  6  2014 template
 4.0K May 21 17:35 stuff
    0 Mar 16 09:46 Items
 1.4K Mar 23 18:07 something.sh
  24K May 19 14:45 curtain

답변3

합창단에 합류한 후 이를 사용하여 awk원하지 않는 열을 지울 수도 있습니다.

[jis@localhost ~]$ ls -lh | awk '{$1=$2=$3=$4="";print}'

    4.0K Aug 19 2014 Desktop
    4.0K Jan 8 22:39 dir1
    4.0K Feb 5 20:41 Documents
    12K May 22 19:31 Downloads
    4.0K Aug 19 2014 Music
    4.0K May 3 20:00 Pictures
    4.0K Aug 19 2014 Public
    115K May 9 09:05 something.bin
    4.0K Aug 19 2014 Templates
    1 Dec 12 07:01 testLink -> .
    4.0K Aug 19 2014 Videos
[jis@localhost ~]$ 

답변4

grep을 사용한 깔끔한 솔루션:

ls -lhn | grep -oP "^([[:graph:]]+\s){4}\K.+"

여기,

[[:graph:]] ==> all printed characters (i.e. no spaces, newlines)
\s          ==> space
{4}         ==> exactly four matches

관련 정보