(同じフォルダーまたは別の場所に)ハードリンクが設定された特定の数のファイルを含むフォルダーがあり、これらのファイルのハードリンクを解除したいので、それらのファイルは独立し、内容の変更が影響を与えません他のファイル(リンク数は1になります)。
以下では、基本的に各ハードリンクを別の場所にコピーしてから元の場所に戻すソリューションを示します。
ただし、この方法はかなり粗雑でエラーが発生しやすいので、ファイルのハードリンクを解除するコマンドがあるかどうかを知りたいのですが。
粗野な答え:
ハードリンクのあるファイルを検索します(編集:ハードリンクのあるソケットなども検索するには、を使用しますfind -not -type d -links +1
):
find -type f -links +1 # files only
find -not -type d -links +1 # files, sockets etc.
ファイルをハードリンク解除する別の方法(ファイルを別の場所にコピーして元に戻す):
編集: Celadaが言ったように、タイムスタンプと権限が失われないように、以下のcp -pを実行するのが最善です。 編集: 一時ディレクトリを作成し、その下のファイルにコピーします。一時ファイルを上書きする代わりに、一部のデータを上書きするリスクを最小限に抑えますが、mv
コマンドは依然として危険です(@Tobuに感謝)。 編集: 同じファイルシステム(@MikkoRantalainen)に一時ディレクトリを作成してみてください。
# This is unhardlink.sh
set -e
for i in "$@"; do
temp="$(mktemp -d -- "${i%/*}/hardlnk-XXXXXXXX")"
[ -e "$temp" ] && cp -ip "$i" "$temp/tempcopy" && mv "$temp/tempcopy" "$i" && rmdir "$temp"
done
だから、非ハードリンクのすべてのハードリンク(の編集:変更-type f
に-not -type d
、上記参照)。
find -not -type d -links +1 -print0 | xargs -0 unhardlink.sh
cp -i
スイッチを、それがオーバーライドする必要があるかどうかを尋ねる私にいくつかのメッセージを吐いた./fileXXXXXX
($temp
、TMPFILEは、一意のファイル名を与えるべきであるにも関わらず、ファイルを)そこので必見なんらかの競合状態などになり、データが失われる危険性があります。
unhardlink.sh
ニーズがunhardlinkedするというファイルが含まれている同じディレクトリ内に一時ディレクトリを作成する必要があります。そうしないと、一時ディレクトリが現在の作業ディレクトリにあるため、再帰呼び出しが別のファイルシステム内で再帰し、ファイルシステムの境界を越えて移動する可能性があります。"$(dirname "$i")/hardlink-XXXXXX"
代わりにmktempの引数として渡すことができると思います。
fuse
実際にはpath/to/hardlink-XXX
とは異なる物理ストレージメディアにディスパッチされる可能性がありますが、それpath/to/original-file
についてできることはあまりないことに注意してください。