2012-12-14 2 views
2

내 작업 중 하나는 특정 날짜 패턴과 일치하는 파일 수를 계산하는 것입니다. 정말 내가해야 할 일은 디렉토리를 반복하고, 각 파일 이름을 검사하고, 그 파일 이름에서 두 번째 마침표를 찾은 다음 다음 4자를 검사하여 내가 조합하고있는 날짜 문자열에 일치하는 항목이 있는지 확인합니다.문자열 발생을 포함하는 파일 찾기

2012 년 11 월은 "1211"로 표시됩니다. 아래의 파일 이름에서 두 번째 마침표 뒤의 처음 네 문자를 사용하면 첫 번째 파일 이름 ("o.tt.121113150804")이 해당 패턴과 일치하므로 히트가됩니다. 나는 그 파일을 센 다음 나머지 두 명만 남겨 둘 것입니다.

아래 파일은 샘플입니다. 그것들은 많은 다른 방법으로 명명 될 수 있습니다. 그들은 보통 시간의 99 % 이하의 변형입니다. 2 개의 마침표가 있고 두 번째 마침표 뒤에 4 자리를 확인해야한다는 사실은 확실한 상수입니다.

이 혼자 ls와 함께 할 수 있지만,이 또한 일치
o.tt.121113150804 
o.stpw.101209092541 
i.rtat.120831045704 
+1

어떻게 bash 질문입니까? – melpomene

답변

4

디렉토리 :

$ ls 
i.rtat.120831045704 o.stpw.101209092541 o.tt.121113150804 

$ ls *.*.1121* 
o.tt.121113150804 

그러나 find이 더 강력하고 유연 :

파일 이름은 내가 확인해야

$ find . -maxdepth 1 -type f -iname "*.*.1211*" 
./o.tt.121113150804 

옵션 :

-maxdepth 1이 디렉토리에만 표시됩니다.

-type f 디렉토리 만이 아니라 파일을 찾습니다. * 아무것도 일치합니다

-iname 사용 패턴이 너무 *.*.1211*. 다음에 어떤 날짜 문자열과 다른 * 아무것도에 이어 두 번째 . 다음에 아무것도 다음에 일치 파일 이름과 일치합니다.

편집 :

는 수 배관 wc -l에 일치의 수를 계산하고 변수에 값을 저장하는 명령 치환을 $(...)를 사용하려면 : 패턴 *.*.1211*이 일치

$ ls 
i.rtat.120831045704 o.stpw.101209092541 o.tt.121113150804 
o.tt.121113150804c1 o.tt.121113150804c2 

$ find . -maxdepth 1 -type f -iname "*.*.1211*" | wc -l 
3 

$ found=$(find . -maxdepth 1 -type f -iname "*.*.1211*" | wc -l) 

$ echo $found 
3 
+1

사소한 문제가있을 수 있습니다.이 파일 이름은'a.12111231'처럼 하나의 점으로 파일 이름을 탐지하는 것으로 보입니다. op는 두 번째 파일을 찾은 것 같습니다. 이'find. -maxdepth 1 -type f -iname "*. *. 1211 *"'이 (가) 작동 중으로 보입니다. 좀 봐주세요 –

+0

@ another.anon.coward 좋은 지적입니다. 여기서는 대소 문자를 구분해야한다고 생각하지 마십시오.'-name'만으로도 충분할 것입니다. 제안 해 주셔서 감사합니다. –

+0

우리가 가지고있는 껍질의 맛이 무엇이든간에 maxdepth 또는 iname을 좋아하지 않습니다. 하지만 그 문제를 해결할 수 있습니다. 이것은 훌륭하게 작동합니다. 당신의 도움에 감사드립니다. – user295197

1

하는 것으로 고정 된 문자열 앞에 두 개 이상의 점이있는 파일. 예 : a.b.c.1211이 일치합니다. 당신은 단지 그들을 계산하려면

shopt -s extglob 
ls +([^.]).+([^.]).1211* 

: 배쉬와

당신은 쓸 수

files=(+([^.]).+([^.]).1211*) 
echo "${#files[@]} files matched" 
0

@sudo_O 및 @glennjackman 귀하의 질문에 대답하지만 당신은 카운트를 얻고 싶었다 경우 대안으로 한 번에 모든 날짜에 대해

ls | awk -F'.' '{count[substr($3,1,4)]++} END{for (date in count) print date, count[date]}' 
관련 문제