2013-02-04 3 views

답변

4

:

$ find . -type f -exec \ 
    fgrep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY" {} \; \ 
    | xargs -i% mv % /path/to/new/dir 
0

이 bash는 간단하다

grep -l "PATTERN" * 

당신에게 현재 디렉토리에있는 패턴을 포함 파일의 목록을 제공합니다. 당신은 너무 많은 파일이 없다면 그래서 당신은 할 수 :

mv `grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY"` /another/directory 

백은 (그들은 더 일반 인용 부호 없음) 틱 명령을 실행하고 (파일 목록이 경우) 출력으로 대체합니다. 뒤 틱 대신 $ (명령)을 사용할 수 있습니다. 그래서 당신은 단지뿐만 아니라 쓸 수 있습니다 : 당신이 파일을 많이하는 경우

mv $(grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY") /another/directory 

은, bash는 많은 파일이 (당신이 당신의 명령이 얼마나 큰 한계에이를 것으로 확장하지 못할 수도 있습니다 ... 그것이 많이). 그런 다음 xargs를에 의지해야합니다

grep -l "SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY" | xargs -i mv {} /another/directory 

xargs를에 -i이가 {}이 확대 될 것이다하는 그렙에서 출력 (일치하는 파일 이름)으로부터 한 번에 하나 개의 라인을 것을 의미합니다 텍스트를 입력하면 명령이 실행됩니다.

0

여기 파이썬의 해결책이 있습니다. os.path.isdir()은 하위 디렉토리를 무시하는 데 필요했습니다. 소스 디렉토리에서이 .py 스크립트를 실행하려면 "and file [-3 :]! = '.py'"가 필요합니다. 또는 .py 파일을 이동해야하는 경우 스크립트의 이름을 확인할 수도 있습니다.

import os 
import shutil 

src = '/source' 
dst = '/destination' 
pattern = 'SAMPLE 350 AN INTEGER OF TYPE :DECIMAL : CAN BE ASSEMBLED BY' 
for file in os.listdir(src): 
    if not os.path.isdir(file): 
    f = open(file) 
    for line in f: 
     if pattern in line and file[-3:] != '.py': 
     f.close() 
     shutil.move(file,dst) 
     break 
    f.close() 
관련 문제