나는 직면한 이 문제를 해결하기 위해 SO에 언급된 다양한 솔루션을 시도했습니다.
모든 파일을 재귀적으로 찾고 일부 텍스트를 변경하고 싶습니다.
이것은 Windows의 cygwin에서 사용하는 명령입니다.
find . -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
내가 얻는 결과는
sed: couldn't edit ./xxx/yyy/filename: not a regular file
여기서 뭔가 빠졌나요?
답변1
find
모든 파일과 모든 디렉터리의 목록을 반환합니다. 실제로 문자열이 포함된 파일을 찾으려면 검색을 제한해야 합니다. 다음을 추가해 보세요.
find -type f ... # Doesn't return directories
find -iname "*.txt" ... # returns only files ending in '.txt' (case insensitive)
또는 정말 고급스러워지고 싶다면 grep을 사용하여 실제로 문자열이 포함된 파일에서만 sed를 실행할 수 있습니다.
grep -l -r 'FCLP1025' | xargs sed -i 's/FCLP1025/FCLP1080/g'
grep은 -r
재귀적으로 검색하여 -l
일치하는 파일의 파일 이름만 나열합니다. 그런 다음 를 사용할 때와 유사하게 xargs
stdin을 사용하여 다음 명령에 인수로 추가합니다 .{}
find -exec cmd {} \;
그러나 Linux의 bash에서 테스트되었으므로 작동하지 않으면 grep --help
git-bash/cygwin에서 플래그가 다른지 확인할 수 있습니다. 그러나 대개는 동일합니다.
답변2
귀하의 명령은 디렉터리(및 기타 비정규 파일)를 찾을 수 있습니다. 디렉토리를 사용할 수 없습니다 sed
.
-type f
명령 에 테스트를 추가하면 find
일반 파일만 처리됩니다.
find . -type f -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
또는 표준 find
옵션과 더 읽기 쉬운 인용문을 사용하세요.
find . -type f ! -path '*.hg*' -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
디렉터리를 완전히 건너뛰려면 다음을 .hg
사용하여 -prune
검색 경로에서 해당 디렉터리를 제거하세요 find
.
find . -name .hg -prune -type f -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
find
이로 인해 이라는 디렉터리에 들어가는 것조차 불가능 해졌습니다 .hg
. 주문회의이와 같은 디렉토리로 가서 그 안의 모든 것을 테스트하는 것은 -path
약간 비효율적입니다 .
내부 편집을 사용하면 진단 메시지가 없는 한 터미널에 출력이 생성되지 않으므로 명령 find
의 출력이 없습니다 . 출력은 편집한 파일로 들어갑니다.sed -i
sed
sed -i
또한 위의 마지막 명령은 find
편집을 시도합니다.모든문서. 편집하려는 파일의 이름을 알고 있는 경우 해당 파일만 실행하도록 -name 'some pattern'
제한하기 전에 추가 할 수 있습니다.-exec
sed