2012-01-31 2 views
4

내 코드는 '바'와 '갑'의 모든 인스턴스를 대체 :xargs를 사용하여 찾기 및 바꾸기 sed - 결과를 파일에 저장할 수 있습니까?

find . -type f | 
xargs grep 'foo' -l | 
xargs sed -i 's|foo|bar|g' 

내가 텍스트 문서에 수정 된 파일의 목록을 저장하고 싶습니다. 가능한가?

편집 :

이 나를 위해 일 최종 코드는 다음과 같습니다

find . -type f -print0 | 
xargs -0 grep 'foo' -l | 
tee result.txt | 
xargs -0 sed -i 's|foo|bar|g' 

이 가장 빠른 방법이지만, 수천이 다른 사이의 속도 차이를 파일인지 확실하지 제안 된 방법은 아마도 매우 작습니다.

+0

왜 당신은 작은 부분 집합 타이밍 테스트하지 않습니다 - 일분 동안 실행 너무 작지 않은,하지만 어쩌면 뭔가를? 나는 당신의 데이터가 어떻게 든 비 전형적이지 않다면 너무 큰 차이를 기대하지 않을 것이다. 그러나 공백, 탭, 줄 바꿈 등을 포함하는 파일 이름으로 코드가 실패합니다. 파일에 이런 파일이 포함되어 있지 않습니까? –

+0

여러분의 의견에 따라 위의 코드를'print0'과'-0'을 사용하여 수정했습니다. – Lewis

+0

예. 그러나 xargs와 유사한 일괄 처리 방법을 사용하면 인수 크기가 명령 줄 제한을 초과 할 때 반드시 공백이나 비표준 문자 (print0)가 있거나 일괄 처리 대신 많은 프로세스 (exec)가 분기 될 위험이 있습니다. – cgseller

답변

8

xargs의 쓸모없는 사용처럼 보이며, 종종 find과 함께 사용됩니다.

find . -type f -exec grep 'foo' -l {} ";" -exec sed -i 's|foo|bar|g' {} ";" -ls > file.lst 

테스트하지 않았으므로 조심해서 사용하십시오. 파일 이름 목록이나 파일 내용을 변경하려고하는지 여부는 확실하지 않습니다. 당신이 grepsed로 검색하기 때문에, 나는 단지 sed 작업하는 것은 충분해야한다 생각 :

find . -type f -exec sed -i 's|foo|bar|g' {} ";" -ls > file.lst 
+0

파일 이름이 아닌 내용 만 수정하고 싶습니다. 수정해야 할 유일한 파일은 문자열을 포함하는 파일입니다. – Lewis

+0

수천 개의 파일을 검색하고 수정해야한다고 덧붙여 야합니다. xargs보다 임원이 더 좋습니까? – Lewis

+1

xargs는 추가 프로세스이므로 -exec로는 더 쉽게 수행 할 수없는 작업을 많이 할 수 없습니다. Find는 결과의 어떤 부분이 파일 이름인지, 어디에 시작하고 어디서 끝나는지를 알고 있습니다. xargs를 안전하게 사용하려면 파일 이름에 공백, 줄 바꿈 및 기타 추악함을 방지해야합니다 (-print0과 함께 가능하지만 명령을 더 크게 만듭니다). (하지만 exec 인수에 2 또는 3을 추가해야합니다. 제한된 요소가 HDD 속도라면, 병렬 호출을 사용하는 것보다는 많이 사용하는 것보다는 병렬 호출을 사용하는 것이 가능합니다. ";" –