심볼릭 링크(텍스트 파일로 간주됨)를 해당 텍스트 파일의 내용으로 변경하려면 어떻게 해야 합니까(예: "심볼릭 링크 비트 제거")?

심볼릭 링크(텍스트 파일로 간주됨)를 해당 텍스트 파일의 내용으로 변경하려면 어떻게 해야 합니까(예: "심볼릭 링크 비트 제거")?

우분투 리눅스에는 다음과 같이 심각하게 손상된 심볼릭 링크가 많이 있습니다.

$ ls -l setup.conf
lrwxrwxrwx 1 ont ont 27 Aug 19 15:26 setup.conf -> '# Source it'$'\r''. ../setup.conf'

. ../setup.conf이는 프로젝트의 모든 심볼릭 링크를 대상 파일에 대한 주석 및 소스 호출("")로 바꾸려고 시도한 결과입니다. 이들은 모두 # Source it\n. .../setup.conf심볼릭 링크 비트가 포함된 실제 텍스트 파일입니다(예: " "). 이는 git과 windows를 사용하여 수행됩니다.

한 가지 이론적 수정은 "symlink 비트"를 제거하고 결과 텍스트 파일을 변경하지 않고 그대로 두는 것입니다. 그러나 그렇게 할 수 있는 방법은 없습니다. ( chmod다른 도구에서는 이것을 "매달린 심볼릭 링크"로 보고 텍스트 파일에서 작동하는 것을 거부합니다. 그 자체).

ls또 다른 수정 방법은 위 명령에서 얻은 것과 동일한 내용 으로 새 파일을 수동으로 만드는 것입니다 . 지루하고 오류가 발생하기 쉽고 파일이 동일하지 않기 때문에 이 작업을 수행하지 않는 것이 좋습니다.

# Source it<newline>. ../setup.conf'편집: 추가됨: 내용이 " " 인 setup.conf라는 일반 파일로 끝내고 싶습니다.

답변1

심볼릭 링크를 수정하고 싶은지 아니면 텍스트 파일로 바꾸고 싶은지 잘 모르겠습니다. 이 솔루션은 기호 링크를 텍스트 파일로 대체합니다.

find -type l -exec bash -c '
    for f in "$@"
    do
        t=$(readlink "$f")
        rm -f "$f"
        printf "%s\n" "$t" >"$f"
    done
' _ {} +

rmprintf작성하는 대신 삭제, 수정을 통해 "$f.tmp.txt"비파괴 테스트를 할 수 있습니다 "$f". ( .tmp.txt나중에 텍스트 파일을 삭제하는 것을 잊지 마십시오.)

\r더 쉽게 읽을 수 있도록 으로 바꾸 려면 \n다음과 같이 할 수도 있습니다.

printf "%s\n" "${t//'$'\r/\n''}" >"$f"     # non-POSIX
printf "%s\n" "$t" | tr "\r" "\n" >"$f"    # POSIX

관련 정보