シンボリックリンク(テキストファイルと見なされます)をそのテキストファイルの内容に変更するにはどうすればよいですか(例:「シンボリックリンクビットの削除」)。

シンボリックリンク(テキストファイルと見なされます)をそのテキストファイルの内容に変更するにはどうすればよいですか(例:「シンボリックリンクビットの削除」)。

Ubuntu Linuxには、次のように深刻に破損したシンボリックリンクがたくさんあります。

$ 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を使って行われます。

1つの理論的な修正は、"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

おすすめ記事