2014-02-20 4 views
1

하나의 문자열을 여러 파일 중에서 다른 문자열로 대체하는 수많은 예제를 보았습니다.하지만 제가하고 싶은 것은 약간 다릅니다. 아마도 훨씬 더 간단합니다 :)전체 파일 검색 및 바꾸기

특정 문자열과 일치하는 모든 파일을 찾아 완전히 새 파일의 내용으로 바꿉니다.

나는이 내가 갱신에 필요한 모든 파일을 찾아

find /home/*/public_html -name "index.php" -exec grep "version:1.23" '{}' \; -print 

작동하는 명령을 찾을 수 있습니다. 전체 콘텐츠를 /home/indexnew.txt의 내용으로 바꾸려면 어떻게해야합니까 (저는 /home/index.php라고도 부를 수 있습니다)

나는 이름이나 이름을 변경하고 싶지 않기 때문에 내용을 강조합니다. 내가 업데이트하는 파일의 소유권.

답변

0

당신은 당신이 대체 할 파일의 무리가 있고, 당신은 당신이 tee 명령 출력을 파이프를 시도 할 수 있습니다 와일드 카드를 사용하여 자신의 이름을 모두 얻을 수있는 경우 :

cat my_file | tee /home/*/update.txt 

이 모든 디렉토리를 찾아야한다 in/home을 선택하고 my_file의 텍스트를 각 디렉토리의 update.txt에 씁니다.

도움이되는지 또는 원하지 않는 것인지 알려주세요.

+0

가 어떻게 내 find 명령과 함께이 결합 할 -l 세부입니까? 배치 파일 500 개를 교체해야합니다. – Marino

1
find ... | while read filename; do cat static_file > "$filename"; done 

효율 힌트 : - 전체가 아닌 파일을 읽을 필요, 그것은 첫 번째 일치가 발견 될 때 즉시 "true"를 반환합니다 grep -q 사용.

+0

고마워! 그게 효과가 있었어! – Marino

0

-l없이 명령을 수행 한 다음 grep에 -l을 직접 추가하여 파일을 나열하는 것보다 더 좋은지 확실하지 않습니다. 여기

find /home/*/public_html -name "index.php" -exec grep -l "version:1.23" '{}' \; |xargs -i cp /home/index.php {} 

는 옵션

-l, --files-with-matches 
      Suppress normal output; instead print the name of each input 
      file from which output would normally have been printed. The 
      scanning will stop on the first match. (-l is specified by 
      POSIX.)