リンク先のファイルが別のパーティションにある場合、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

おすすめ記事