Sed를 편집할 수 없습니다. 일반 파일이 아닙니다.

Sed를 편집할 수 없습니다. 일반 파일이 아닙니다.

나는 직면한 이 문제를 해결하기 위해 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일치하는 파일의 파일 이름만 나열합니다. 그런 다음 를 사용할 때와 유사하게 xargsstdin을 사용하여 다음 명령에 인수로 추가합니다 .{}find -exec cmd {} \;

그러나 Linux의 bash에서 테스트되었으므로 작동하지 않으면 grep --helpgit-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 -isedsed -i

또한 위의 마지막 명령은 find편집을 시도합니다.모든문서. 편집하려는 파일의 이름을 알고 있는 경우 해당 파일만 실행하도록 -name 'some pattern'제한하기 전에 추가 할 수 있습니다.-execsed

관련 정보