UNIX 와일드 카드로 파일 범위 나열


14

예를 들어, 작업 디렉토리에 mjk0001.fits, mjk0002.fits, ... mjk9999.fits까지 수치 적으로 증가하는 파일이 있다고 가정하십시오.

UNIX 와일드 카드를 사용하여 순차적 그룹을 나열하거나 조작하는 방법이 있습니까? 예를 들어 0025에서 0050까지 프로세스를 실행해야하는 경우 어떤 형식을 사용합니까?

다음을 시도했지만 성공하지 못했습니다.

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

미리 감사드립니다, MK


답변:


20

중괄호 확장을 사용할 수 있습니다.

ls mjk00{25..50}.fits

필요한 경우 선행 0을 포함 할 수 있습니다.

ls mjk0{000..149}.fits

1
이 구문을 사용하여 단계 값을 지정할 수도 있습니다 {25..50..2}..
nobar

1

직접적이지는 않지만 여러 glob 패턴을 사용할 수 있습니다.

ls mjk002[56789].fits mjk00[34]?.fits

그것은 정확히 당신이 찾고있는 것이 아니지만, glob 패턴이 제공하는 가장 가까운 것이므로 각 파일 시스템을 입력하는 것보다 확실히 낫습니다. 숫자 범위 당 필요한 패턴 수는 범위의 숫자 끝점 로그에 의해 결정됩니다.


1

grep과 함께 정규식을 사용할 수 있습니다. 나는 정규 표현식 전문가가 아닙니다. 다음은 25-50 사이의 숫자가있는 패턴을 반환합니다.

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

그것이 가능한지 그리고 어떻게 grep으로 이것을 일반화하는지 모르겠습니다.


0

for루프와 printf다음 을 사용하여 이식성 또는 유연성을 향상시킬 수 있습니다 .

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

이것은 공간을 잘 처리하고 결과는 xargs추가 가공 을 위해 배관하기 에 매우 적합합니다 .

일치하는 항목이 여러 개인 경우 일치하는 모든 파일이 나열됩니다.

일치하지 않는 숫자는 stderr에서 오류를보고하지만 ||truebash 수준 오류 리턴 은 억제합니다.


그러나 기본적인 경우에는 forand를 사용 printf하는 것이 더 간결하지 않습니다.

ls --escape mjk{0025..0050..1}* ||true

중괄호 확장 결과를 분리하려면 for 루프를 사용할 수 있습니다.for i in {025..050} ; do ... ; done
nobar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.