내 숙제는 어떻게든 해당 문자로 시작하는 모든 파일의 목록을 가져와야 합니다.에프, 나는 다음 명령을 알고 있습니다.
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
자체적으로 작업을 수행하지는 않습니다.