"a"로 시작하고 뒤에 1자리 또는 2자리 숫자가 오는 모든 파일을 나열하는 명령은 무엇입니까?

"a"로 시작하고 뒤에 1자리 또는 2자리 숫자가 오는 모든 파일을 나열하는 명령은 무엇입니까?

"a"로 시작하고 뒤에 1자리 또는 2자리 숫자가 오는 모든 파일을 나열하는 명령은 무엇입니까? (출력에는 a0, a1, a2, a3, a00, a01, a99...가 표시될 수 있지만 a333, b12, art53...은 표시되지 않습니다.)

답변1

zsh껍질 에서 ,

setopt EXTENDED_GLOB
printf '%s\n' a[[:digit:]](#c1,2)(.)

이 패턴은 이름이 로 시작하고 뒤에 하나 또는 두 개의 숫자가 오는 a[[:digit:]](#c1,2)(.)모든 일반 파일과 일치합니다 . a마지막은 하나 또는 두 개의 숫자와 일치하는 (.)일반 파일 이름만 가져오도록 합니다 .[[:digit:]](#c1,2)

sh또는 등등 에서 bash,

printf '%s\n' a[[:digit:]] a[[:digit:]][[:digit:]]

그러면 an으로 시작하고 한 자리 또는 두 자리 숫자를 포함하는 모든 이름이 나열됩니다 a(한 자리 이름에는 하나의 패턴을 사용하고 두 자리 이름에는 다른 패턴을 사용함). 그러나 일반 파일의 이름만 얻을 수 있는지(디렉토리 이름 등을 얻을 수도 있음), 하나 또는 다른 패턴(또는 둘 다)이 일치하지 않는지는 확실하지 않습니다.어느이름을 지정하면 패턴은 확장되지 않은 상태로 유지됩니다( 일치하지 않는 패턴을 제거하려면 shopt -s nullglobin을 사용하세요).bash

비정규 파일을 지우려면 루프를 사용하십시오.

for name in a[[:digit:]] a[[:digit:]][[:digit:]]; do
    if [ -f "$name" ]; then
        printf '%s\n' "$name"
    fi
done

여기서는 -f각 이름에 대해 명시적인 테스트를 적용합니다. 이 테스트는진짜이름이 일반 파일(또는 일반 파일에 대한 심볼릭 링크)을 참조하는 경우. 테스트가 다음과 같은 경우진짜, 이름을 인쇄합니다.

답변2

사용하는 쉘에 의존하지 않는 보다 일반적인 솔루션은 다음과 같을 수 있습니다.

Helios:t larry$ ls -1
a0
a10
a100
ax
axe
b4
Helios:t larry$ find . -mindepth 1 -maxdepth 1 -type f -regextype egrep -regex '\./a[[:digit:]]{,2}'
./a10
./a0

그러나 이로 인해 추가 프로세스가 생성됩니다.

관련 정보