최소 4자리 숫자의 파일 찾기

최소 4자리 숫자의 파일 찾기

이런 파일이 너무 많아요[a-zA-Z]+\d\.\d{2}\_\d.\d{4}.end최소 4자리 숫자의 이전 파일을 찾고 싶습니다 .end. (충돌시 모든 파일을 원합니다)

Bash를 사용하여 이를 수행하는 방법은 무엇입니까? sort분명히 그것만으로는 사전 편찬 순서로 인해 작동하지 않습니다.

답변1

GNU 도구를 사용하면 다음을 수행할 수 있습니다.

find . -regextype posix-extended \
  -regex '.*/[a-zA-Z]+[0-9]\.[0-9]{2}_[0-9]\.[0-9]{4}\.end' -print0 |
  awk -v RS='\0' -F . '
    NR == 1 || $(NF-1) < min {files=$0; min = $(NF-1); next}
    $(NF-1) == min {files = files "\n" $0}
    END {if (NR) print files}'

다음은 일반적인 패턴의 예입니다. 일치하는 파일의 NUL로 구분된 목록을 인쇄하고(NUL은 파일 경로에 나타날 수 없는 유일한 문자이기 때문에) NUL로 설정된 레코드 구분 기호를 사용하여 출력을 처리합니다 (그러나 모든 구현이 지원되는 awk것은 아닙니다). awk이것 ).

이것필드 구분 기호으로 설정되어 있습니다 .. NF는 필드 수이며 $(NF-1)마지막 필드 앞의 마지막 필드도 마찬가지입니다. awk마지막으로 알려진 값과 비교하여 가장 작은 숫자를 찾고 해당 파일을 files awk변수에 저장합니다.

NUL 구분 목록 대신 개행 구분 목록을 저장하므로 사용자 출력에만 사용됩니다. 안정적으로 사후 처리하려면 NUL( "\0"awk에서)을 사용해야 합니다.

답변2

및 옵션 find과 함께 Bash를 사용하십시오 .sort -t|--field-separator-k|--key

find_files.sh:

#!/bin/bash
first_file=$(find . -iname '*.end' | sort -t '.' -k 4.1 | head -1)
IFS='.'
fields=($first_file)
unset IFS
find . -iname "*${fields[3]}.end"

옵션에는 다음 양식이 -k|--key필요합니다 .KEYDEF필드 번호.문자번호. 유효한 경우 필드 번호는 공백이 아닌 -t|--field-separator지정된 구분 기호(이 경우 )를 기준으로 .계산 됩니다.

그런 다음 Bash를 사용하여 첫 번째 파일에서 필요한 패턴을 추출합니다.입력 필드 구분 기호find, 여러 파일이 동일한 4자리 숫자를 공유하는 경우 패턴과 일치하는 파일을 디렉터리에서 다시 검색합니다.

예:

$ ls -1
abc0.03_1.1921.end
def0.03_9.0311.end
ghi0.03_1.1966.end
jkl1.04_1.1916.end
mno2.04_4.9540.end
pab9.04_1.1994.end
uvx7.04_3.2002.end
yyy1.05_8.0311.end
zzz4.04_1.2097.end
$ ./find_files.sh
./yyy1.05_8.0311.end
./def0.03_9.0311.end

답변3

sort-t-k파일 이름의 점으로 구분된 부분 중 하나를 기준으로 정렬할 수 있는 및 이 경우에 수행해야 하는 작업이 있습니다 .

-t, --field-separator=SEP
    use SEP instead of non-blank to blank transition

-k, --key=KEYDEF
    sort via a key; KEYDEF gives location and type

(에서 인용GNU 정렬 매뉴얼 페이지.)

답변4

perl -le '
   for ( grep { /^[a-zA-Z]+\d\.\d{2}\_\d.\d{4}\.end$/ } <*.end> ) {
      ($n) = /(\d{4})\.end$/;
      $min //= $n;
      $n <= $min and $min = $n, push @{$h{$min}}, $_;
   }
   print for @{$h{$min}};
'

<*>와일드카드 구문을 사용하여 모든 관련 파일을 수집합니다. 여기서 올바른 구문 파일은 로 표시되어야 합니다 for.

내부적으로는 for먼저 마지막 4자리를 추출하여 이를 실행 숫자와 비교하고 minimum, 발견되면 해시에 푸시합니다.

마지막으로 키를 사용하여 해시된 콘텐츠를 인쇄합니다 $min.

관련 정보