2012-10-10 2 views
1

여기 내 문제가 있습니다. 우리는 사람들이 PII를 포함하는 양식을 계속 작성하는 파일 서버 (Windows 2003)가 있습니다. 정책은 이제 사람의 SSN 중 마지막 4 개가 더 이상 파일 서버의 모든 양식에 허용되지 않게되었습니다. 나는 문서에서 "SSN"또는 "Last Four"와 같은 문자열을 검색하는 스크립트를 찾아 내려고하고 있는데, 로컬 컴퓨터에서 텍스트 파일을 검색하는 방법에 대한 지침/예제를 찾을 수 있습니다. 나는 이것과 비슷한 스레드를 많이 보았지만 주로 로컬 폴더에서 txt 파일을 검색했다. Powershell 스크립팅은 우리 서버에서 사용할 수 없도록 설정되어 있지만 이렇게하는 이유는 묻지 않습니다.네트워크 드라이브의 파일에서 문자열을 검색하는 가장 좋은 방법

이것이 가능합니까? 필자는 단서 찾기를 희망하거나 올바른 방향으로 나를 이끌어 내기 위해 여러 개의 Perl 책을 많이 읽었으며 행운이 없었습니다.

+0

* 최선의 방법은 서버에서 스크립트를 실행하는 것입니다. 네트워크 액세스가 느립니다. – josh3736

+0

고맙습니다. josh3736 ... 그 생각은하지만 그건 내 문제의 일부로 도움이됩니다. – Fosterocalypse

+0

모든 종류의 다른 형식 (파일 형식)을 사용하고 있습니까? 아니면 파일 형식이 일관됩니까? –

답변

1

파일에 대한 액세스 권한이 있다고 가정하면 파일 디렉토리를 검색하여 문자열 일치를 찾는 방법에 대해 알아볼 수 있습니다.

use strict; 
use warnings; 
use File::Find; 

our $CHECK_FILE_EXTENSION = qr/.txt$/; 
File::Find::find({wanted=>\&find_ssn, no_chdir=>1},$_) for @ARGV; 
exit; 

sub find_ssn 
{ 
    ## File::Find sets $File::Find::name with full path to file, which is the correct path to an 'open' call when 'no_chdir' is used 
    return unless $File::Find::name =~ $CHECK_FILE_EXTENSION; 
    open F,$File::Find::name || die "Can't read file, $File::Find::name, $!\n"; 
    while(<F>) 
    { 
     if(/SSN/) 
     { 
      ## file as 'SSN' in it, do your work here 
     } 
    } 
    close F; 
} 
+0

나는 이것에 관해서 꽤 초록색이지만 ... "## 파일을 'SSN'으로 적고 여기서 일을해라."예를 들어 파일 이름을 복사 할 곳이 어디 있겠 니? 텍스트 로그 파일? – Fosterocalypse

+0

수정. "## file as SSN"은 기본적으로 파일에 있고 SSN을 찾았습니다. 예를 들어 다른 파일에 로그 한 다음 'last'를 사용하여 그 파일과 다음 파일로 이동 – mrk

+0

Oesor의 솔루션과 나의 차이점은 한 번에 한 줄만 읽는 반면, File :: Slurp는 검색을하기 전에 전체 파일을 메모리로 읽습니다. 당신에게 좋은 접근 방식을 결정해야합니다. Oesor의 해결책의 까다로운 부분은 검색 할 문자열에 줄 바꿈이 있고 정규식이/s를 사용하지 않는다는 것입니다 (한 줄 일치의 경우 줄 바꿈을 사용하지 마십시오) – mrk

1

i/o 속도를 제외하고 파일을 로컬에서 원격으로 액세스 할 때 실제적인 차이점은 없습니다. 그것은 단지 파일 기술자 일뿐입니다.

C:\>perl -MFile::Slurp -E "my $dir = q|//SERVER/Share/Test|; for my $file (read_dir($dir)) { say qq|$file: |, (read_file(qq|$dir/$file|) =~ /foo/) ? q|match| : q|not match| }" 
bar.txt: not match 
foo.txt: match 
관련 문제