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에서 해결되었습니다.
대상 파일 시스템에 임시 파일이 생성됩니다. 더 이상 파일 시스템 간에 이동할 필요가 없습니다.