"ls -l" 스타일 목록의 열을 정렬하려면 찾기를 사용하세요.

"ls -l" 스타일 목록의 열을 정렬하려면 찾기를 사용하세요.

ls -l를 사용할 때 얻는 목록과 동일한 형식을 얻으려고 노력하고 있습니다 find. 끝은 파일 이름이 아닌 전체 경로 이름이지만. FWIW 나는 find (GNU findutils) 4.5.11.

플래그를 찾았습니다 -ls. 괜찮지만 열 사이에 훨씬 더 많은 간격이 있어 ls -l유용하지 않습니다. 특히 끝에 전체 경로 이름을 사용하면 결과를 두 행으로 밀어넣어 읽기가 어려워질 수 있기 때문입니다. 예를 들어...

$ find /example -ls
  7439    4 -rwxrwxr-x   1 example    example        1579 Oct 26  1985 /path/to/first/file/that/was/found
   530    4 -rwxrwxr-x   1 example    example         122 Oct 26  1985 /path/to/second/file/that/was/found

그래서 이 일이 완료되는 동안 나는 그것을 더 잘하고 싶습니다. -printf깃발을 보면 find같은 목적을 달성한 것 같습니다. 지금까지 나는 -printf '%M %u %g %p\n'훌륭한 정보를 갖고 있으며 원하는 정보를 사용자 정의하고 여기에 다른 정보를 추가할 수 있습니다. 하지만...

문제는 열을 정렬하는 방법입니다.

이 접근 방식은 사용자 이름과 그룹 이름의 길이가 다른 경우 덜 효과적입니다. 예를 들어...

$ find /example -printf '%M %u %g %p\n'
-rwxr-xr-x root root /path/to/first/example/file
-rwxr-xr-x example example /path/to/second/example/file

이 문제를 어떻게 해결할 수 있나요? 그냥 사용하는 것이 가장 좋지만 find, 이것이 가능하지 않다면 다른 것으로 파이핑하는 것이 좋습니다. 매뉴얼 페이지에서는 find이 옵션을 전혀 사용하지 않는 것 같습니다 -printf.

답변1

-printfGNU의 형식 지정자는 C 함수 find와 마찬가지로 너비 및 정렬 등의 한정자를 사용합니다. printf()즉, 데이터를 왼쪽이나 오른쪽으로 정렬할 수 있으며 현재 프로젝트에서 결정적으로 특정 너비를 할당할 수 있습니다.

기본 출력:

$ find . -printf '%M %u %g %p\n'
drwxr-xr-x kk wheel .
-rw-r--r-- kk wheel ./.zshrc
-rw-r--r-- kk wheel ./file
drwxr-xr-x root wheel ./rootstuff
-rw-r--r-- root wheel ./rootstuff/SECRET
-rw------- kk wheel ./.viminfo

사용자 및 그룹 열의 너비(6)를 지정합니다(오른쪽 정렬).

$ find . -printf '%M %6u %6g %p\n'
drwxr-xr-x     kk  wheel .
-rw-r--r--     kk  wheel ./.zshrc
-rw-r--r--     kk  wheel ./file
drwxr-xr-x   root  wheel ./rootstuff
-rw-r--r--   root  wheel ./rootstuff/SECRET
-rw-------     kk  wheel ./.viminfo

동일하지만 왼쪽 정렬:

$ find . -printf '%M %-6u %-6g %p\n'
drwxr-xr-x kk     wheel  .
-rw-r--r-- kk     wheel  ./.zshrc
-rw-r--r-- kk     wheel  ./file
drwxr-xr-x root   wheel  ./rootstuff
-rw-r--r-- root   wheel  ./rootstuff/SECRET
-rw------- kk     wheel  ./.viminfo

파일 크기는 바이트 단위이며 5자리 숫자가 할당됩니다(실행 방법을 보여주기 위해 0으로 채워짐).

$ find . -printf '%M %-6u %-6g %05s %p\n'
drwxr-xr-x kk     wheel  00512 .
-rw-r--r-- kk     wheel  00000 ./.zshrc
-rw-r--r-- kk     wheel  00095 ./file
drwxr-xr-x root   wheel  00512 ./rootstuff
-rw-r--r-- root   wheel  00000 ./rootstuff/SECRET
-rw------- kk     wheel  00922 ./.viminfo

명령은 ls실제 ​​필요에 따라 열에 너비를 동적으로 할당할 가능성이 높지만, 각 열에 필요한 공간을 먼저 계산한 다음 다시 실제로 출력 형식을 지정하기 위해 find -printf명령을 두 번 실행하지 않는 한 명령은 정적 너비를 사용해야 합니다 . 출력이 너무 넓은 find이유 find -ls는 2단계 접근 방식을 사용하지 않고 각 열에 충분한 공간을 제공하고 모든 것이 잘 정렬되기를 바랍니다.


물론, 수천 개의 파일이 없고그냥 모든 걸 나열하고 싶어, 재귀적으로(즉, 에 있는 경로 이름에 대해 필터링하거나 다른 작업을 수행할 필요가 없음 find) 다음을 사용할 수 있습니다 ls.

$ ls -d -l **/*
-rw-------  1 kk    wheel  922 Jul 25 23:46 .viminfo
-rw-r--r--  1 kk    wheel    0 Jul 19 23:39 .zshrc
-rw-r--r--  1 kk    wheel   95 Jul 25 23:51 file
drwxr-xr-x  2 root  wheel  512 Jul 26 00:00 rootstuff
-rw-r--r--  1 root  wheel    0 Jul 26 00:00 rootstuff/SECRET

이는 을 사용하는 경우 기본적으로 셸 **에 있는 사용 가능한 와일드카드 패턴 에 의존합니다 . 또한 숨겨진 이름과 일치하는 셸에 의존합니다. and 를 사용하여 이 옵션을 설정하면 쉘이 이 작업을 수행합니다 .zshbashshopt -s globstarzshGLOB_DOTSsetopt GLOB_DOTSbashshopt -s dotglob

와일드카드 패턴이 너무 길어서 "매개변수 목록이 너무 김" 오류가 생성되는 목록으로 확장되는 경우 이 방법은 작동하지 않습니다.

ls -l -R이 출력은 디렉터리가 개별적으로 나열되지 않고 디렉터리 사이에 구분 기호가 있으므로 일반 출력과 다릅니다 .

답변2

또 다른 간단한 대안이 있습니다.

$ find example -exec ls -ld {} +

관련 정보