특정 문자열을 포함하는 모든 파일 나열

특정 문자열을 포함하는 모든 파일 나열

이전 파일 위에 새 파일을 복사할 수 있도록 특정 문자열이 포함된 모든 파일을 재귀적으로 찾아야 합니다. 예를 들어:

파일에 "replace me"라는 문자열이 포함되어 있는 경우:

  1. 파일의 전체 경로를 찾으십시오.

    /dir/of/file/filename.php
    /dir/of/different/file/filename.php
    
  2. 이 파일을 새 파일로 교체하세요 filename.php.

간단해 보이지만 시간만 낭비하고 진전이 없었습니다.

답변1

이그나시오의 솔루션with가 find아마도 가장 좋은 방법일 것입니다. 리뷰의 모든 세부정보가 여기에 포함되어 있습니다. 나는 구체적으로 파일(디렉토리 아님)만 검색한 다음 세 개의 문을 그룹으로 그룹화하고 OR 문을 사용하여 모든 이름과 일치시켰습니다.

find /dir/ \
    -type f \
    \( -name timthumb.php -or -name thumb.php -or -name rt-timthumb.php \) \
    -exec grep -q "timthumb" {} \; \
    -exec cp filename.php {} \;

그러나 다음과 같이 쉘 글로브 패턴을 사용하여 찾을 수도 있습니다.

shopt -s extglob
for file in /dir/**{timthumb,thumb,rt-timthumb}.php; do
    grep -q 'timthumb' "$file" && cp filename.php "$file"
done

와일드카드 대신 grep을 사용하여 재귀적으로 검색할 수도 있습니다. 파일이 많은 경우에 유용합니다.

grep -l -R -Z 'timthumb' /dir/**thumb.php | while read -d $'\0' file; do
    cp filename.php "$file"
done

모든 경우에 "/dir/"을 작업하려는 기본 경로로 바꾸고 "filename.php"를 덮어쓰려는 소스 파일로 바꾸십시오. 필요에 따라 견적을 받으세요. 이전 예에서는 이름이 "*thumb.php"와 일치하는 모든 파일을 일치시키기 위해 바로가기를 사용했습니다. 다른 예제에서도 이 작업을 수행할 수 있습니다. 찾기의 경우 전체 OR 문 세트를 괄호 안에 넣고 를 사용할 수 있습니다 -name '*thumb.php'. 위의 모든 예는 이러한 이름 패턴과 일치하고 "timthumb" 문자열을 포함하는 파일에 대해서만 작동합니다.

답변2

find some/dir \
    -exec grep -q "replace me" {} \; \
    -exec cp some/new/filename.php {} \;

관련 정보