이런 파일이 너무 많아요[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
.