2014-11-19 4 views
1

나는 다음과 같은 문제가 : 난 단지 이름에 번호가 파일을 찾을 I가 "찾기"명령을 사용하는 것이이이름에 번호가 파일 이름을 찾기보다 낮은 1950

File256name.txt 
File307list.cvs 
File2014text.xls 

같은 파일 목록이를 보다 낮은 1950 그래서 이전 목록으로 나는 단지이 파일은 내가이 명령을 시도

File256name.txt 
File307list.cvs 

을 나열했을

find . -type f \(-iname '*[1-9][0-9][0-9]*' \) 

하지만 이름에 번호가 포함 된 파일도 표시됩니다.> 1950

추가로 모든 파일은 다른 파일 이름과 확장자를 가질 수 있으며 번호의 위치는 예측할 수 없습니다 ... 사용하려는 간단한 명령을 찾고 있습니다. 수식을 포함하여 (나를 찾기를 사용하는 필수 위해) 발견에 또한 비지 박스의 v1.16.1을위한

덕분에 내 리눅스 버전의 한계를 고려

1950 이상의 숫자 낮은있는 경우에만 파일을 선택하는 방법 help

+0

awk있어? –

+0

예, awk 사용 가능 – Maxrock70

답변

2

differen를 사용할 정규식을 사용해야합니다. 세기에 관한 10 년 :

.*(19[5-9][0-9]|[2-9][0-9]{3}).* 

(4 자리 숫자는 1950보다 크거나 같음).

이 정규식을 사용하면 find의 부정 옵션을 사용하여 번호> = 1950이 아닌 파일을 가져올 수 있습니다. 숫자가없는 파일을 제거하려면 두 번째 기준을 사용하십시오.

내가 발견으로이 테스트하지했지만, 당신이 사용하는 정규식을 허용 1000 < 1950

편집 :

전체 명령 비지 박스의와

find . -regextype posix-egrep -regex '.*[0-9].*' \! -regex '.*(19[5-9][0-9]|[2-9][0-9]{3}).*' 

좀 더 찾을 이스케이프가 필요합니다.

find . -regex '.*[0-9].*' \! -regex '.*\(19[5-9][0-9]\|[2-9][0-9]\{3\}\).*' 
+0

OP의 예에는 3 개의 숫자 만있는 파일이 포함되어 있습니다. –

+0

@ 자이더 : 어느 쪽도 효과가 있습니다. 정규 표현식은 숫자> = 1950 (적어도 4 자리수)과 일치 한 다음 결과를 무효화합니다. 이 방법은 정규식이 3 자리 숫자와 일치하지 않으며 부정으로 인해 찾기 기준이 일치합니다 (모든 숫자가 <1000). – urzeit

+0

사용할 수있는 전체 명령을 제공해 주시겠습니까? – Maxrock70

3

파이프로 (G) awk

find . -type f | awk 'match($0,/[0-9]+/,a)&&a[0]<1950' 

이는 숫자가있는 파일 만 일치시킨 다음 1950 미만이고 인쇄하는지 확인합니다. 파일은 1 자릿수 또는 4로 시작하고 앞에 오는 0으로 작동합니다.

그것은 문자 클래스문자열 제거으로 떠들썩한 파티에서 간단히 할 수
+0

명령을 시도했지만 여전히 두 파일을 모두 가져옵니다. MyNas> find/volume1/homes/admin/tmp/-type f | awk '일치 ($ 0,/[0-9] + /, a) && a [0] <1950' /volume1/homes/admin/tmp/ciccio2014ooo.txt /volume1/homes/admin/tmp/ciccio306oooo. cvs – Maxrock70

+0

결과가 awk에 전달 되었습니까? –

+0

Awk의 버전을 확인하십시오. GAWK에서만 사용할 수 있습니다. 죄송합니다. ( –

0

:

#!/bin/bash 

for i in "[email protected]"; do 
    ffn="${i##*/}" 
    num="${ffn//[^0-9]/}" 
    [ "$num" -le 1950 ] && echo "$i => $num" 
done 

입력 :

File1949text.doc 
File1950text.doc 
File1951text.dat 
File2014text.xls 
File256name.txt 
File307list.cvs 

출력 :

$ bash ../fn1950.sh File* 
File1949text.doc => 1949 
File1950text.doc => 1950 
File256name.txt => 256 
File307list.cvs => 307 
+0

:-(제한됩니다 '-f FILE' – urzeit

+0

이 그것을 할 수 있습니다.. find 명령 만 사용 하시겠습니까? – Maxrock70

+0

Ooh, busybox 요구 사항을 간과해서 죄송합니다. "find"로 무언가를 찾았지만 urgeit에서 사용한'regex' 접근 방식보다 ** 다른/더 효율적인 ** 것을 찾지 못했습니다. 찾지 못했습니다. 미안해. –

관련 문제