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
-printf
GNU의 형식 지정자는 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 를 사용하여 이 옵션을 설정하면 쉘이 이 작업을 수행합니다 .zsh
bash
shopt -s globstar
zsh
GLOB_DOTS
setopt GLOB_DOTS
bash
shopt -s dotglob
와일드카드 패턴이 너무 길어서 "매개변수 목록이 너무 김" 오류가 생성되는 목록으로 확장되는 경우 이 방법은 작동하지 않습니다.
ls -l -R
이 출력은 디렉터리가 개별적으로 나열되지 않고 디렉터리 사이에 구분 기호가 있으므로 일반 출력과 다릅니다 .
답변2
또 다른 간단한 대안이 있습니다.
$ find example -exec ls -ld {} +