"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 nullglob
in을 사용하세요).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
그러나 이로 인해 추가 프로세스가 생성됩니다.