링크된 대상 파일이 다른 파티션에 있는 경우 dos2unix는 심볼릭 링크를 따라갈 수 없습니다.

링크된 대상 파일이 다른 파티션에 있는 경우 dos2unix는 심볼릭 링크를 따라갈 수 없습니다.

a.txt심볼릭 링크의 대상인 CRLF로 끝나는 텍스트 파일이 있습니다 link.txt. 기본적으로 dos2unix기호 링크는 따르지 않습니다. 나는 --follow-symlink이것에 추가해야합니다.

a.txt동일한 파티션에 있는 경우 link.txt작동합니다 . 그렇지 않으면 실패합니다.

예:

pi@raspberrypi(rw):~$ file a.txt
a.txt: ASCII text, with CRLF line terminators

pi@raspberrypi(rw):~$ ln -s a.txt link.txt

pi@raspberrypi(rw):~$ dos2unix link.txt
dos2unix: Skipping symbolic link link.txt.

pi@raspberrypi(rw):~$ dos2unix --follow-symlink link.txt
dos2unix: converting file link.txt to Unix format...

pi@raspberrypi(rw):~$ file a.txt
a.txt: ASCII text

pi@raspberrypi(rw):~$ ln -s /home/pi/a.txt /mnt/mountpoint/link.txt

# Revert a.txt to CRLF endings
pi@raspberrypi(rw):~$ unix2dos a.txt
unix2dos: converting file a.txt to DOS format...

pi@raspberrypi(rw):~$ file a.txt
a.txt: ASCII text, with CRLF line terminators

pi@raspberrypi(rw):~$ dos2unix --follow-symlink /mnt/mountpoint/link.txt
dos2unix: problems renaming '/mnt/mountpoint/d2utmpS6Oz6x' to '/home/pi/a.txt': Invalid cross-device link
          which is the target of symbolic link '/mnt/mountpoint/link.txt'
          output file remains in '/mnt/mountpoint/d2utmpS6Oz6x'
dos2unix: problems converting file /mnt/mountpoint/link.txt

이 문제를 어떻게 해결할 수 있나요?

감사해요

답변1

dos2unix먼저 임시 파일을 변경한 다음 rename(2)시스템 호출을 사용하여 대상으로 다시 이동합니다.

$ strace -e trace=rename dos2unix --follow-symlink /mnt/mountpoint/link.txt
rename("/mnt/mountpoint/d2utmpt4sobL", "/home/pi/a.txt") = -1 EXDEV (Invalid cross-device link)
dos2unix: problems renaming '/mnt/mountpoint/d2utmpt4sobL' to '/home/pi/a.txt': Invalid cross-device link
          which is the target of symbolic link '/mnt/mountpoint/link.txt'
          output file remains in '/mnt/mountpoint/d2utmpt4sobL'
dos2unix: converting file /mnt/mountpoint/link.txt to Unix format ...
dos2unix: problems converting file /mnt/mountpoint/link.txt
+++ exited with 18 +++

다음과 같은 임시 파일이 변경된 것을 볼 수 있습니다 /mnt/mountpoint/d2utmpt4sobL.

$ file /mnt/mountpoint/d2utmpt4sobL
/mnt/mountpoint/d2utmpt4sobL: ASCII text

그러나 출력에서 ​​볼 수 있듯이 파일 시스템이 다르기 때문에 대상으로 다시 이름을 바꿀 수 없습니다 strace.

rename("/mnt/mountpoint/d2utmpt4sobL", "/home/pi/a.txt") = -1 EXDEV (Invalid cross-device link)

매뉴얼 페이지에서 다음 rename(2)을 볼 수 있습니다:

       EXDEV  oldpath  and  newpath  are  not  on the same mounted filesystem.
              (Linux permits a filesystem to be mounted  at  multiple  points,
              but  rename()  does not work across different mount points, even
              if the same filesystem is mounted on both.)

유일한 해결책은 링크가 아닌 대상 자체를 변경하는 것입니다. readlink -f/ 명령을 사용하여 readlink --canonicalize링크 대상을 찾을 수 있습니다

$ file /home/pi/a.txt
/home/pi/a.txt: ASCII text, with CRLF line terminators

$ dos2unix $(readlink -f /mnt/mountpoint/link.txt)
dos2unix: converting file /home/pi/a.txt to Unix format ...

$ file /home/pi/a.txt
/home/pi/a.txt: ASCII text

답변2

이 문제는 dos2unix 7.5.1에서 해결되었습니다.

대상 파일 시스템에 임시 파일이 생성됩니다. 더 이상 파일 시스템 간에 이동할 필요가 없습니다.

관련 정보