2010-04-09 3 views
4

을 변경하지 않고 대체 나오지 나는이 명령 줄 검색을 발견하고 예를 대체하는 방법 : 모든 그것을 통해 검색된 파일에 날짜 및 파일 소유권 변경을 제외하고검색 및 소유권

find . -type f -print0 | xargs -0 sed -i 's/find/replace/g' 

그것은 심지어, 좋은 일을 그 검색 텍스트를 포함하지 않았습니다.

이 작업의 더 나은 해결책은 무엇입니까?

답변

4

-c 옵션을 사용하면 (리눅스 사용자 인 경우) sed가 소유권을 유지해야합니다. 명령을 사용하면 실제로는 모든 파일을 다시 쓰지만, find이 포함되지 않은 파일을 변경하지는 않습니다.

+0

아아아히 알았다. 감사. – Ian

+0

'sed '의 어떤 버전에'-c'가 있습니까? GNU sed 4.2.1은 그렇지 않습니다. –

+0

필자는 man 페이지에서 다음과 같이 작업하고있었습니다 : http://linux.die.net/man/1/sed - CentOS 4 설치에서 sed의 man 페이지는 옵션으로'-c'를 보여주고'sed --version'는'GNU sed version 4.1.2'를보고합니다; 'sed --version'가'GNU sed version 4.1.5'를보고하는 CentOS 5 설치의 경우; MacOSX에는'-c' 옵션이 없기 때문에 리눅스를 지정했습니다. – Isaac

3

최초 그렙를 사용하여 텍스트를 포함하는 경우에만 파일에 나오지도 실행하는 것 그 문제를 해결하는 가장 쉬운 방법 :이 (최악의 경우)를 두 번 각각의 파일을 읽을 필요합니까

find . -type f | while read file; do 
    grep -q find $file && sed -i 's/find/replace/g' $file 
done 

을, 그래서 조금 느려질 수도 있습니다. 다행히도 OS가 파일을 디스크 캐시에 보관해야하므로 속도가 느려지지 않아야합니다.이 프로세스는 CPU 경계가 아닌 I/O 경계입니다.

+0

Isaac의 대답에 따라 , 소유권의 변경을 막기 위해 솔루션에 -c를 추가해야합니다. – Ian

+2

은'grep + sed'를 사용할 필요가 없습니다. – ghostdog74

+0

'grep'은 변경 될 필요가없는 파일에 sed를 전혀 적용하지 않으므로 수정 시간을 변경하지 않아야합니다. – Isaac

1

일부 배포판의 sed (즉, RedHat 및 제품군)은 이것을 수행하는 -c 옵션을 추가했으며이 경우 @ Isaac의 대답을 참조하십시오.

패치되지 않은 GNU sed를 사용하는 사람들은 내가 찾은 가장 쉬운 방법은 perl로 대체하는 것입니다. perl은 사용 가능한 경우 sed -c과 유사한 파일을 다시 작성합니다. 다음 명령은 기본적으로 동일합니다.

sed -ci 's/find/replace/' 
perl -pi -e 's/find/replace/' 

너무 흥분하지 말고 perl -pie; sed -ie과 같이 다른 옵션으로 해석하는 대신 -i에 대한 인수로 e을 사용하고 접미사로 사용하여 원본 파일을 백업합니다. 자세한 내용은 perldoc perlrun을 참조하십시오.

펄의 정규식 파싱은 sed (better, imo)와는 좀 더 복잡한 일을하기 때문에 조금 다릅니다 : 일반적으로 백 슬래시는 적게 사용하십시오.