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