![특정 문자열을 포함하는 모든 파일 나열](https://linux55.com/image/17377/%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94%20%EB%AA%A8%EB%93%A0%20%ED%8C%8C%EC%9D%BC%20%EB%82%98%EC%97%B4.png)
이전 파일 위에 새 파일을 복사할 수 있도록 특정 문자열이 포함된 모든 파일을 재귀적으로 찾아야 합니다. 예를 들어:
파일에 "replace me"라는 문자열이 포함되어 있는 경우:
파일의 전체 경로를 찾으십시오.
/dir/of/file/filename.php /dir/of/different/file/filename.php
이 파일을 새 파일로 교체하세요
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 {} \;