문자로 시작하는 모든 파일을 나열할 수 있지만 디렉터리는 나열할 수 없습니까?

문자로 시작하는 모든 파일을 나열할 수 있지만 디렉터리는 나열할 수 없습니까?

내 숙제는 어떻게든 해당 문자로 시작하는 모든 파일의 목록을 가져와야 합니다.에프, 나는 다음 명령을 알고 있습니다.

ls F*

하지만 디렉토리도 제공됩니다. 실제 파일만 표시할 수 있나요?

답변1

POSIX적으로:

find . ! -name . -prune -type f -name 'F*'

그리고 zsh:

print -rl -- F*(.)

답변2

find 명령을 사용할 수 있습니다.

find ./ -name "F*" -type f

-f 유형즉, 일반 파일만 필요하다는 의미입니다.

답변3

물론 - 사용find( ls기존처럼 이름이 정렬되지 않아서 이렇게 추가했습니다.)

find . -type f -maxdepth 1 -name 'F*' |sort |xargs ls -l {} \;

또는 (이름만 원하는 경우)

find . -type f -maxdepth 1 -name 'F*' |sort

-maxdepth옵션을 사용할 수 없습니다.POSIX, 하지만 로 표시했으므로 bash몇 가지 가정을 할 수 있습니다. 예를 들어, 다음과 같은 경우에 작동합니다.OSX(사람들이 일반적으로 사용하는 다른 플랫폼 bash).

어쨌든, 무슨 일이 있어도 하위 find디렉터리의 파일이 표시됩니다.ls아니요추가되지 않음-R옵션.

한 가지 문제 find는 출력에 인쇄할 수 없는 문자(공백 등)가 포함된 파일 이름이 포함될 수 있다는 것입니다. Linux와 OSX 모두 find에서 사용 가능확장하다(POSIX에서는 아님)이 호출되고 -print0다음에 적용됩니다.xargs보완적인 확장 -0. 그래서 당신은할 수 있다이 작업을 수행:

find . -type f -maxdepth 1 -print0 -name 'F*'  |sort -z |xargs -0 ls -l {} \;

또는 (정렬 기능을 포기하려는 경우) POSIX를 직접 사용할 수 있습니다.

find . -type f -maxdepth 1 -name 'F*' -exec ls -l {} +

정렬은 자세한 목록을 원할 때 주로 문제가 되지만 POSIX는+이름 목록의 (여전히 합법적인) 개행 문자가 정렬을 방해하므로 정렬된 목록을 원하는 경우에는 도움이 되지 않습니다.

@cuonglmPOSIX에는 다음과 같은 옵션이 있다는 점을 지적하세요 -prune.

-prune
기본은 항상 true로 평가되어야 합니다. 디렉토리인 경우 find가 현재 경로 이름 아래로 이동하지 않습니다.

find여기에 표시된 대로 인수에 "."을 사용하는 경우에는 이 옵션이 필요하지 않습니다 -maxdepth. 사실이지만 한 단계 더 비유하면 ls"."은 동일 ls -a하지만 OP의 질문을 엄격하게 일치시키면 "-a" 옵션이 제거되고 인수는 find"*"가 될 수 있습니다. 그러나 (참고로@cuonglm), -prune다음에만 적용됩니다.목차, find * -prune디렉토리 내용과 일치합니다.

예를 들어, 쉘 와일드카드 확장을 사용할 수도 있습니다.

for n in F*;do [ -f "$n" ] && echo "$n"; done

ls F*이는 인쇄되지 않는 문자를 물음표로 변환하지 않기 때문에 (아마도) 바람직합니다. 따라서 와일드카드 확장은 두 경우 모두 명령 길이 제한에 도달합니다.

궁극적으로 대답은 OP가 원하는지 여부에 따라 다릅니다.체크리스트또는목록이름. 그러나 두 경우 모두 ls자체적으로 작업을 수행하지는 않습니다.

관련 정보