요청 로그를 다양한 파일에 저장하는 스크립트를 작성했습니다. 시간이 지날수록 폴더에 들어있는 파일의 개수는 많이 늘어나는 것 같습니다. 이제 특정 기간에 대한 일부 로그에 액세스해야 하는데 그렇게 할 수 없습니다.
로그 파일 이름 형식은 다음과 같습니다. 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)}}'
편집: 명확히 하기 위해 이는 사용자가 이미 해당 디렉토리에 있다고 가정합니다. (점은 현재 디렉토리를 나타냅니다.) 그렇지 않으면 "."을 디렉터리 경로로 바꾸세요.