셀 수 없는 파일이 있는 디렉토리의 파일을 검색하는 방법은 무엇입니까?

셀 수 없는 파일이 있는 디렉토리의 파일을 검색하는 방법은 무엇입니까?

요청 로그를 다양한 파일에 저장하는 스크립트를 작성했습니다. 시간이 지날수록 폴더에 들어있는 파일의 개수는 많이 늘어나는 것 같습니다. 이제 특정 기간에 대한 일부 로그에 액세스해야 하는데 그렇게 할 수 없습니다.

로그 파일 이름 형식은 다음과 같습니다. 2016-02-11_124805_4269_170784456256bc8305a7e8b1455194885_req.xml

지금까지 나는 시도했다

  • ls
  • tar -cvzf 2016-02-20.tar.gz 2016-02-20*.xml압축파일
  • cat 2016-02-20_01* | grep -nr "text_to_search"
  • ls -lah >> ../list.log
  • find ./dirname -type f >> list2.log
  • 그리고 검색 스크립트

    for each_file in ./dirname/*
    do
    echo ls -lah $each_file >> ./dirname_file.log
    done
    

그리고 tar돌아오면 cat다른 arguments list too long사람들은 아직 나에게 응답하지 않았습니다.

도움을 주시면 감사하겠습니다.

답변1

find ./dirname -type f -name "2016-02-20_01*"작동할 수도 있지만 여전히 빠르지는 않을 것입니다.

그러면 이렇게 할 수 있습니다.

find ./dirname -type f -name "2016-02-20_01*" -print | xargs grep -n "text_to_search"

답변2

"ls"의 경우 속도 저하가 대부분 정렬로 인해 발생한다는 인상을 받았습니다.

'ls -f'는 정렬을 비활성화합니다. 내 경험에 따르면(몇 년 전에 ext3 및 xfs를 사용하여 nntp 서버를 실행했습니다) 훨씬 빠르게 작동합니다.

답변3

이 시도:

perl -le 'opendir $d,".";while($f=readdir($d)){print $f if $f =~ /^2016-02-20_01/}'

이는 디렉토리 항목을 직접 읽고 해당 항목에 대한 작업을 수행하려고 시도하지 않습니다. 실제로 파일 내용을 보려면 다음을 사용할 수 있습니다.

perl -le 'opendir $d,".";while($f=readdir($d)){if($f =~ /^2016-02-20_01/){print "=== $f ===";open(my $i,"<",$f);while(<$i>){print};close($i)}}'

편집: 명확히 하기 위해 이는 사용자가 이미 해당 디렉토리에 있다고 가정합니다. (점은 현재 디렉토리를 나타냅니다.) 그렇지 않으면 "."을 디렉터리 경로로 바꾸세요.

관련 정보